SZ配列

いまいち C3 内で C# が広まらないことを少々嘆いている今日この頃。
すっかり肌寒くなりましたが、いかがお過ごしでしょうか。

今回は SZ 配列(SZ Array)のお話。
SZ とは “single dimension, zero-base” の略です。
1次元で0が下限の配列……要はよく使う普通の配列ですね。
.NET Framework の中間言語である IL には SZ 配列のために特別な命令が用意されているので、
SZ 配列でない配列に比べパフォーマンスが向上します。

検証してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var count = 10000;
var watch = new Stopwatch();
var array1D = new int[count * count];
var array2D = new int[count, count];
var jaggedArray = new int[count][];
for (int i = 0; i < count; i++)
{
jaggedArray[i] = new int[count];
}
watch.Start();
for (int i = 0; i < count * count; i++)
{
array2D[0, 0] = 1;
}
watch.Stop();
Console.WriteLine("array2D : {0}ms", watch.ElapsedMilliseconds);
watch.Restart();
for (int i = 0; i < count * count; i++)
{
jaggedArray[0][0] = 1;
}
watch.Stop();
Console.WriteLine("jaggedArray : {0}ms", watch.ElapsedMilliseconds);
watch.Restart();
for (int i = 0; i < count * count; i++)
{
array1D[0] = 1;
}
watch.Stop();
Console.WriteLine("array1D : {0}ms", watch.ElapsedMilliseconds);

100000000回、配列の一要素に値をセットするだけのコードです。
以前の記事で書いた2次元配列・ジャグ配列と、 SZ 配列を比較しました。

実行結果は以下のとおり。
[text]
array2D : 396ms
jaggedArray : 255ms
array1D : 234ms
[/text]
環境によって多少違いはありますが、上から下にいくほど時間がかからないようになるはずです。
2次元配列は SZ 配列ではないので SZ 配列の1.5倍ほどの時間がかかっています。
ジャグ配列は SZ 配列の SZ 配列なので SZ配列とほぼ変わらない時間になっています。
わずかに遅いのは、参照が1回ずつ多くなるためだと思われます。

配列といっても2次元配列やリストなど様々なものがありますが、
SZ 配列で十分な場合はできるだけ SZ 配列を使うことでパフォーマンスの向上が期待できますね。

参考
配列の Address メソッド