院生エンジニアのにっき

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

Generic型のListはArrayListよりも遅いのか?(修正→Generic型の方が早かった)   2008-01-28

以前書きましたGeneric型のList<int>はArrayListよりも遅いのか?の計測結果が間違っていました。

コメントにて指摘していただいた通り、GenericなListの方がArrayListより早かったです。

計測方法が間違ってるよ。
ElapsedMilliseconds プロパティは経過時間の合計を取得するものだから、正しく計測するには2つめの sw.Start() の前に sw.Reset() を追加する必要があるよ。
だから、この例だとGenericなListの処理にかかった時間はArrayListより少ないはず。
通りすがり

結果はArrayListが1905msでList559msでした。

ちなみに修正版のコードは以下の通りです。

  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. //******************************************
  23.     sw.Reset(); //追加
  24. //******************************************
  25.  
  26.     //List<int>での測定
  27.     List<int> array2 = new List<int>();
  28.     for (int j = 0; j < array_size; j++) {
  29.       array2.Add(rand.Next(value_max));
  30.     }
  31.     sw.Start();
  32.     for (int j = 0; j < trial_count; j++) {
  33.       int k = array2[rand.Next(array_size)];
  34.     }
  35.     sw.Stop();
  36.     Console.WriteLine("List<int>:" + sw.ElapsedMilliseconds);
  37.   }
  38. }

ブログ上にコードを公開していなかったら指摘していただけず、私の理解はArrayListからint型にキャストした方が約3割弱早いという間違った理解のままだったかと思います。

ご指摘ありがとうございました。


コメントを書く