0

私はいくつかの実験を実行し、それらのタイミングを計り、時間を比較して最良の「アルゴリズム」を見つけています。出てきた質問は、タスクを並行して実行すると実験の相対的な実行時間が間違ってしまうのか、そしてそれらを順番に実行することでより代表的な結果が得られるのかということでした。コードの(簡略化された)バージョンは次のとおりです。

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. 実験を順番に実行することで、より代表的な結果を得ることができますか?

4

1 に答える 1

2

これは、実行しているマシンと実験の内容によって異なりますが、一般的に答えは「はい」です。相互に影響を与える可能性があります。主にリソースの枯渇を介して。次に例を示します。

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

これにより、優先度の高いスレッドでタイトループが実行され、完了するまで基本的に1つのプロセッサが消費されます。マシンにプロセッサが1つしかなく、TPLがそのプロセッサで2つの実験をスケジュールすることを決定した場合、もう1つはCPU時間に飢えます。

于 2012-05-09T18:35:24.253 に答える