2016年11月12日土曜日

【C#】ループ内で複数処理と複数ループの速度差

■共通の事前処理(20億個のデータを用意しておく)
◆ソースコード
var list = Enumerable.Repeat(1, 1000 * 1000 * 200).ToList(); // 大量データ生成

① ForEach、ラムダを2回で、ループ内処理を1回
◆ソースコード
int sum1 = 0, sum2 = 0;
list.ForEach((it) => sum1 += it);
list.ForEach((it) => sum2 += it);
◆結果
 1回目:Time=01.97秒, sum1=200000000, sum2=200000000
 2回目:Time=02.09秒, sum1=200000000, sum2=200000000

② ForEach、ラムダを1回で、ループ内処理を2回
◆ソースコード
int sum1 = 0, sum2 = 0;
list.ForEach((it) => { sum1 += it; sum2 += it; } );
◆結果
  1回目:Time=01.08秒, sum1=200000000, sum2=200000000
  2回目:Time=01.03秒, sum1=200000000, sum2=200000000

③ forループを2回で、ループ内処理を1回
◆ソースコード
int sum1 = 0, sum2 = 0;
for (int i = 0; i < list.Count; i++) sum1 += list[i];
for (int i = 0; i < list.Count; i++) sum2 += list[i];
◆結果
  1回目:Time=01.61秒, sum1=200000000, sum2=200000000
  2回目:Time=01.45秒, sum1=200000000, sum2=200000000

④ forループを1回で、ループ内処理を2回
◆ソースコード
int sum1 = 0, sum2 = 0;
for (int i = 0; i < list.Count; i++) { sum1 += list[i]; sum2 += list[i]; }
◆結果
  1回目:Time=00.85秒, sum1=200000000, sum2=200000000
  2回目:Time=00.78秒, sum1=200000000, sum2=200000000

⑤ Aggregateを2回で、ループ内処理を1回(用途が適切でないと思うが、見てみる)
◆ソースコード
var sum1 = list.Aggregate((elem1, elem2) => elem1 + elem2);
var sum2 = list.Aggregate((elem1, elem2) => elem1 + elem2);
◆結果
  1回目:Time=08.39秒, sum1=200000000, sum2=200000000
  2回目:Time=05.65秒, sum1=200000000, sum2=200000000

■結論
当然と言えば、当然だが、処理時間は2倍になる。
コードの読みやすさは、人によって違うだろうけど、①かなぁ?

◎環境
 ●速度確認した仮想マシン
  • CPU:4
  • メモリ:2GB
  • OS:Windows10
  • 仮想マシン:VMWare ESXi6.0U2
  • Visual Studio 2015 Enterprise(試用版)
  • 構成:Releaseでビルド
  • デバッグ情報(ビルドの詳細設定):none
  • Visual Studio ホスティングプロセス:無効
 ●ホストPCの性能(参考)
  • CPU:Intel Core i5-4250U
  • メモリ:16GB
  • ドライブ:SSD

0 件のコメント:

コメントを投稿