バイト先の上司とGeneric型よりもArrayListによる値のキャストの方が早いという話が出たので早速ベンチマークで計ってみました。
テスト用のソースコードは以下の通り(C#でのベンチマークってはじめてなんであってるかどうか・・・、.Netには標準でStopwatchクラスがあるなんて素敵ですね)。
class Test {
const int trial_count = 10000000;
const int array_size = 1000000;
const int value_max = 1000;
public Test() {
System.
Diagnostics.
Stopwatch sw =
new System.
Diagnostics.
Stopwatch();
Random rand =
new Random
();
//ArrayListでの測定
ArrayList array =
new ArrayList
();
for (int j = 0; j < array_size; j++) {
array.Add(rand.Next(value_max));
}
sw.Start();
for (int j = 0; j < trial_count; j++) {
int k = (int)array[rand.Next(array_size)];
}
sw.Stop();
Console.WriteLine("ArrayList:" + sw.ElapsedMilliseconds);
//List<int>での測定
List<int> array2 =
new List<int>
();
for (int j = 0; j < array_size; j++) {
array2.Add(rand.Next(value_max));
}
sw.Start();
for (int j = 0; j < trial_count; j++) {
int k = array2[rand.Next(array_size)];
}
sw.Stop();
Console.WriteLine("List<int>:" + sw.ElapsedMilliseconds);
}
}
結果はArrayListの場合で2002ms、Listの場合で2813msとArrayListからint型にキャストした方が約3割弱早いという結果に。。
上のテスト用コードが間違ってないとすると3割弱は結構な差ですね。Generic型を覚えてから天下のArrayListを手放してガンガン便利なGeneric型を利用していたのですが、悔い改めようかと思います(ちなみに一応value_maxをint.MaxValueにしてみても結果は同じでした)。
・・・型付きのGeneric型の方がキャストしない分早いような気がしていたんですがねぇ(誰か内部の動きに詳しい方いたら教えて下さいませ)。
次回は「Delegateは遅いのか?」を
計測方法が間違ってるよ。
ElapsedMilliseconds プロパティは経過時間の&amp;quot;合計&amp;quot;を取得するものだから、正しく計測するには2つめの sw.Start() の前に sw.Reset() を追加する必要があるよ。
だから、この例だとGenericなListの処理にかかった時間はArrayListより少ないはず。
本当ですね。。
修正しておきます。
ArrayList:1905
List<int>:559
という結果になりました。
通りすがりさん、ありがとうございます。