Parallelを使用してみる

C#4.0から並列処理を行う方法としてParallelというクラスが追加されました。メニーコア環境が当たり前となってきた昨今では、以下にたくさんのコアを利用して処理時間を短縮するかということも実装手段の一つになるでしょう。

ということでどのような感じで変わるのか確認してみました。確認方法は、IPアドレスのオクテットを生成する処理時間を確認するだけの単純なプログラムです。

サンプルプログラム - ParallelSample.zip

結果はParallelを使用した方が処理時間が30%程度かかってしまいました。(環境はCPUがCore i5でメモリが4GBです。)

こちらはパフォーマンスカウンタでCPU時間を取得したときのグラフです。(CPU TotalTimeを取得しているので正確ではないですが、参考にはなるでしょう。)

performance_counter

パフォーマンスカウンタの結果を見る限りParallelを使用している処理ではCPUが100%近くまで使用されています。すべてにParallelを使用した場合(11:44:50付近)は50%以上で遷移していますが、Thread間の同期をとるために時間がかかっているのでしょうか…。

最後のParallelを使用しない場合(11:45:05付近)は確かにCPU使用率が50%未満ですので1コアのみ使用と推測できます。

今回のプログラムは単純にループの階層を作っただけなのですが、どうにも思うとおりの結果(Parallelの方が速い)が得られませんでした。どうもどのような処理を行っているのか確認した方がよさそうです。。。