2016-11-01 2 views
-3

실제 컴퓨팅 작업과 비슷한 가짜 테스트를 만들었습니다. 현재 코드 :C# 하나의 긴 컴퓨팅 프로세스를 병렬 처리하는 최선의 방법은 무엇입니까?

static void Main() 
{ 
    List<ulong> list = new List<ulong>(); 
    Action action =() => 
    { 
     Random rng = new Random(Guid.NewGuid().GetHashCode()); 
     ulong i = 0; 
     do 
     { 
      i++; 
      if (rng.Next(100000000) == 1000) 
      { 
       lock (list) list.Add(i); 
       Console.WriteLine("ThreadId {0}, step {1}: match is found", 
            Thread.CurrentThread.ManagedThreadId, i); 
      } 
     } while (list.Count < 100); 
    }; 
    int length = Environment.ProcessorCount; 
    Action[] actions = new Action[length]; 
    for (int i = 0; i < length; i++) 
     actions[i] = action; 
    Parallel.Invoke(actions); 

    Console.WriteLine("The process is completed. {0} matches are found. Press any key...", 
         list.Count); 
    Console.ReadKey(); 
} 

하나의 긴 컴퓨팅 프로세스에 병렬 작업 수를 최적화하는 더 좋은 방법이 있습니까?

+0

새끼 고양이에게 불쾌감을주는'List'를'lock'하는 대신'ConcurrentBag'와 같은 TPL 콜렉션을 체크 아웃해야합니다 – MickyD

+0

@MickyD. [여기] (http://stackoverflow.com/a/29307598/6123485)를 보시고 직접 시도하십시오. 나는 그랬다. – quicktrick

+0

OP에 downvoting. 그러한 경우에 대한 더 나은 접근 방법을 알고 있다면 downvoting 대신 답을주십시오. 나는이 질문을하기 전에 인터넷을 매우 오래 검색했다. 나는 아직 그러한 과제에 대한 더 나은 해결책을 찾지 못했다. – quicktrick

답변

2

질문을 올바르게 이해했는지 확실하지 않습니다. 공유 한 코드는 다른 액션 인스턴스를 동시에 실행합니다. 그러나 성능을 위해 병렬로 장기 실행 작업을 계산하려면 장기 실행 작업을 작은 작업 그룹으로 나누어야합니다. 또는 컬렉션을 반복하는 경우 TPL에서 제공하는 Parallel for 또는 foreach를 사용할 수 있습니다 (작업 병렬 라이브러리) 코어 수와 CPU 부하 등 메트릭에 따라 스레드 수를 결정합니다.

+1

미안 해요^^ 나는 내 일을 소그룹으로 나눌 수 없다. 그것은 제가 위에서 준 것과 거의 같습니다. 가장 좋은 성냥을 찾는 길고 긴 유전 알고리즘입니다. 컬렉션에 대해 병렬 처리를 반복하는 방법에 대해 알고 있지만 전체적으로 알고리즘의 성능이 저하되고 리소스 소모가 크게 증가합니다. 나는 이미 그 접근법을 시도했다. 이 방법이 현재 테스트 중입니다. – quicktrick

+0

그래서 같은 시점에 다른 시작점을 사용하여 동일한 알고리즘을 실행하여 일치를 더 빨리 발견 할 확률을 높일 수 있습니다. 그렇다면 당신이 당신의 접근 방식에 맞고 TPL이 어떤 이익도 내지 않을 것이라고 생각합니다. – Mertus

관련 문제