2012-05-09 6 views
0

일부 실험을 실행하고 타이밍을 비교하여 최상의 "알고리즘"을 찾습니다. 문제는 병렬로 작업을 실행하면 실험의 상대 실행 시간이 잘못되고 순차적으로 실행하여 더 많은 결과를 얻을 수있는 경우입니다. C에서 작업 병렬 라이브러리를 사용하는 병렬 작업 타이밍

public static void RunExperient(IEnumerable<Action> experiments) 
    { 
     Parallel.ForEach(experiments, experiment => 
     { 
      var sw = Stopwatch.StartNew(); //line 1 
      experiment();     //line 2 
      sw.Stop();      //line 3 
      Console.WriteLine(@"Time was {0}", sw.ElapsedMilliseconds); 
     }); 
    } 

내 질문

은 "무대 뒤에서"무슨 일이 일어나고 있는지에 대해 다음과 같습니다 :

작업이 시작
  1. , 그것은 가능한 OS이다 여기에 코드 (간체) 버전입니다 또는 프레임 워크는 실행 중에 작업을 일시 중지하고 나중에 실험의 실행 시간을 완전히 잘못 만들 수 있습니다.

  2. 순차적으로 실험을 실행하여 더 많은 결과를 얻을 수 있습니까?

답변

2

실행중인 컴퓨터와 실험 내용에 따라 다르지만 일반적으로 대답은 예일 뿐이므로 서로 영향을 미칠 수 있습니다. 주로 자원 기아를 통해. 다음은 예입니다 :이 완료 될 때까지 기본적으로 하나의 프로세서를 소비하는 높은 우선 순위의 스레드에 꽉 루프를 할 것

public class Piggy { 
    public void GreedyExperiment() { 
     Thread.Priority = ThreadPriority.Highest; 
     for (var i=0;i<1000000000;i++) { 
      var j = Math.Sqrt(i/5); 
     } 
    } 
} 

. 시스템에 하나의 프로세서 만 있고 TPL이 두 개의 실험을 예약하기로 결정하면 다른 하나는 CPU 시간이 부족해질 것입니다.

+0

실제로 이것은 보통 우선 순위 스레드에서 csrss.exe를 호출합니다. 우선 순위 반전 작업 :) – usr

+0

물론, 나는 더 적절한 작업을 할 것입니다. 요점은 여전히 ​​계속 나타납니다 –

+0

하지만 다른 작업이 전혀 시작되지 않는다는 것을 의미합니까? 이것은 문제가되지 않습니다. 그 이후로는 타이밍이 더 이상 시작되지 않을 것입니다. 한 태스크가 이미 시작된 상태에서 다른 태스크가 인계되면 문제가 발생합니다. 이 일이 일어날 수 있습니까? (당신의 대답에서 할 수있는 것 같지만, 그냥 확인하고 싶습니다) – BjartN

관련 문제