0

이 예제에서는 프로그램을 단순화 했으므로 기본적으로 파일을로드하고 파일의 값을 목록에 추가합니다. 내가 루프의 처리 속도를 높이기 위해 찾고중첩 루프의 성능 향상

IList<string> MyList = new List<string>(); 

Main() 
{ 
    foreach(Row r in InputFile) 
    { 
     foreach(Cell c in r) 
     { 
      AddToList(c.Value); 
     } 
    } 
} 

public void AddToTheList(string value) 
{ 
    MyList.Add(value); 
} 

, 나는 값이 추가 된 순서에 대해 걱정하지 않는다.

루프를 병렬로 실행하거나 AddToTheList 메서드를 비동기 적으로 처리하고 잊어 버릴 생각입니다.

코드가 처리하는 서버를 사용하고 파일을 처리하는 총 시간을 단축하는 가장 간단한 방법은 무엇입니까?

+0

'서버 사용'이란 무엇을 의미합니까? – rhughes

+1

성능에 대한 코드 검토가 필요하기 때문에이 질문은 논점의 여지가 없습니다 - checkout codereview.stackexchange.com –

+0

'InputFile'의 유형은 무엇입니까? – rhughes

답변

4

업데이트 : 내부 루프가이 작업을 CPU 바인딩 (IO 바인딩이 아닌)하기에 충분히 무거 우면 Parallel.ForEach을 사용하여 루프를 분할 할 수 있습니다. 여기에 예제가있다 :

Parallel.ForEach(InputFile, row => 
{ 
    foreach(Cell c in row) 
     AddToList(c.Value); 
}); 

을 또는 당신이 필요로하는 값을 반환하는 AddToList 서명을 변경하고 대신 PLINQ를 사용합니다.

MyList = InputFile.AsParallel() 
        .SelectMany(row => row.AsParallel() 
             .Select(cell => TransformCell(cell.Value)) 
        .ToList(); 

public string TransformCell(string value) 
{ 
    return value + " something"; 
} 

AddToTheList 만들기 화재 - 및 - 잊어 비동기 방식 것은 거의 확실하게 좋은 옵션이 아닙니다. 이 메서드에 의해 throw 된 예외는 처리되지 않고, 사용중인 프레임 워크에 따라 응용 프로그램이 중단 될 수 있습니다.


AddToTheList에 대한 호출을 병렬 처리하는 것은 좋지 않습니다.이 작업은 IO 바인딩입니다. 병목 현상은 디스크에서 얼마나 빨리 데이터를 읽을 수 있는지에 있습니다.

디스크 액세스 병렬화도 좋지 않습니다. 동일한 파일을 읽는 두 개 이상의 스레드를 갖는 것이 더 빠르지는 않습니다. 어쨌든 교대로 처리해야합니다. 이 답변보기 Is it possible to use threads to speed up file reading?

파일을 가지고있는만큼의 스레드를 사용하십시오.

1

에 따라 다릅니다. 행과 셀을 구문 분석하고 목록에 값을 추가하는 것이 간단하다면 병렬로 작업하는 것이 도움이되지 않습니다. I/O가 제한되어 CPU보다 훨씬 느립니다.

그러나 행을 구문 분석하는 데 시간이 걸리고 실제로 List에 추가하는 것이 아니라 복잡한 작업을 수행하는 경우 파일에서 행을 읽고 병렬로 행을 처리 할 수 ​​있습니다. 메모리를 사전 할당합니다. 그들 (List)을 사용하면 각 행의 List 위치에 병렬로 액세스 할 수 있습니다.