Stopwatch
メソッドとfor/foreach
ループのプロファイルを作成するために使用するクラスを作成しました。for
and loopsを使用して、または実装foreach
に対して標準ループをテストします。Parallel.For
Parallel.ForEach
次のようにパフォーマンステストを作成します。
方法:
PerformanceResult result = Profiler.Execute(() => { FooBar(); });
Forループ:
SerialParallelPerformanceResult result = Profiler.For(0, 100, x => { FooBar(x); });
ForEachループ:
SerialParallelPerformanceResult result = Profiler.ForEach(list, item => { FooBar(item); });
テスト(、、またはのいずれか)を実行するときはいつでも.Execute
、.For
パフォーマンス.ForEach
が時間の経過とともにどのように変化するかを確認できるように、テストをループに入れます。
パフォーマンスの例は次のとおりです。
メソッド実行1=200ms
メソッド実行2=12ms
メソッド実行3=0ms
実行の場合1=300ms(シリアル)、100ms(パラレル)
実行の場合2 = 20ms(シリアル)、75ms(パラレル)
実行の場合3 = 2ms(シリアル)、50ms(パラレル)
ForEach実行1=350ms(シリアル)、300ms(並列)
ForEach実行2 = 24ms(シリアル)、89ms(並列)
ForEach実行3 = 1ms(シリアル)、21ms(並列)
私の質問は次のとおりです。
パフォーマンスが時間の経過とともに変化するのはなぜですか。これを容易にするために、.NETはバックグラウンドで何を行っていますか?
シリアル操作がパラレル操作よりも速いのはなぜですか?違いを正しく確認するために、操作を複雑にするようにしました...ほとんどの場合、シリアル操作の方が高速に見えます!?
注:並列処理の場合、8コアマシンでテストしています。