院生エンジニアのにっき

  • Change style to Blue
  • Change style to Red
  • Change style to Green
  • Change style to Pink

Generic型のListはArrayListよりも遅いのか?   2008-01-17

バイト先の上司とGeneric型よりもArrayListによる値のキャストの方が早いという話が出たので早速ベンチマークで計ってみました。

テスト用のソースコードは以下の通り(C#でのベンチマークってはじめてなんであってるかどうか・・・、.Netには標準でStopwatchクラスがあるなんて素敵ですね)。

  1. class Test {
  2.   const int trial_count = 10000000;
  3.   const int array_size = 1000000;
  4.   const int value_max = 1000;
  5.   public Test() {
  6.     System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
  7.     Random rand = new Random();
  8.  
  9.     //ArrayListでの測定
  10.     ArrayList array = new ArrayList();
  11.     for (int j = 0; j < array_size; j++) {
  12.       array.Add(rand.Next(value_max));
  13.     }
  14.     sw.Start();
  15.     for (int j = 0; j < trial_count; j++) {
  16.       int k = (int)array[rand.Next(array_size)];
  17.     }
  18.     sw.Stop();
  19.  
  20.     Console.WriteLine("ArrayList:" + sw.ElapsedMilliseconds);
  21.  
  22.     //List<int>での測定
  23.     List<int> array2 = new List<int>();
  24.     for (int j = 0; j < array_size; j++) {
  25.       array2.Add(rand.Next(value_max));
  26.     }
  27.     sw.Start();
  28.     for (int j = 0; j < trial_count; j++) {
  29.       int k = array2[rand.Next(array_size)];
  30.     }
  31.     sw.Stop();
  32.     Console.WriteLine("List<int>:" + sw.ElapsedMilliseconds);
  33.   }
  34. }

結果はArrayListの場合で2002ms、Listの場合で2813msとArrayListからint型にキャストした方が約3割弱早いという結果に。。

上のテスト用コードが間違ってないとすると3割弱は結構な差ですね。Generic型を覚えてから天下のArrayListを手放してガンガン便利なGeneric型を利用していたのですが、悔い改めようかと思います(ちなみに一応value_maxをint.MaxValueにしてみても結果は同じでした)。

・・・型付きのGeneric型の方がキャストしない分早いような気がしていたんですがねぇ(誰か内部の動きに詳しい方いたら教えて下さいませ)。

次回は「Delegateは遅いのか?」を


コメントを書く
  • 通りすがり(2008 01/28(月) 00:22)
    計測方法が間違ってるよ。
    ElapsedMilliseconds プロパティは経過時間の&amp;amp;quot;合計&amp;amp;quot;を取得するものだから、正しく計測するには2つめの sw.Start() の前に sw.Reset() を追加する必要があるよ。
    だから、この例だとGenericなListの処理にかかった時間はArrayListより少ないはず。
  • 院生エンジニア(2008 01/28(月) 15:25)
    本当ですね。。
    修正しておきます。
    ArrayList:1905
    List&lt;int&gt;:559
    という結果になりました。
    通りすがりさん、ありがとうございます。