1 次元配列がジャグ配列よりも高速であるかどうかに興味があり、次のコード ブロックのパフォーマンスを測定しました。
テスト 1: ギザギザの配列
double[][][][] jagged = ArrayExtensions.Get4DMatrix<double>(100, 100, 50, 50, 0);
for (int iter = 0; iter < 5; iter++)
{
sw.Restart();
for (i = 0; i < 100; i++)
{
for (j = 0; j < 100; j++)
{
for (k = 0; k < 50; k++)
{
for (l = 0; l < 50; l++)
{
test = jagged[i][j][k][l];
jagged[i][j][k][l] = test;
}
}
}
}
Console.WriteLine("Jagged Arrays, Test {0}: {1} ms", iter, sw.ElapsedMilliseconds);
}
テスト 2: 1 次元配列
double[] single = ArrayExtensions.Get1DArray<double>(25000000);
for (int iter = 0; iter < 5; iter++)
{
sw.Restart();
for (i = 0; i < 100; i++)
{
for (j = 0; j < 100; j++)
{
for (k = 0; k < 50; k++)
{
for (l = 0; l < 50; l++)
{
test = single[i * 100 + j * 100 + k * 50 + l];
single[i * 100 + j * 100 + k * 50 + l] = test;
}
}
}
}
Console.WriteLine("Single Arrays, Test {0}: {1} ms", iter, sw.ElapsedMilliseconds);
}
テストを実行すると、次の結果が得られます。
Jagged Arrays, Test 0: 1447 m
Jagged Arrays, Test 1: 1429 m
Jagged Arrays, Test 2: 1431 m
Jagged Arrays, Test 3: 1430 m
Jagged Arrays, Test 4: 1429 m
Single Arrays, Test 0: 386 ms
Single Arrays, Test 1: 387 ms
Single Arrays, Test 2: 386 ms
Single Arrays, Test 3: 387 ms
Single Arrays, Test 4: 387 ms
また、配列への割り当てのみでテストを実行し、次に配列からの読み取りのみでテストを実行しましたが、結果は同じ比率でした。
1 次元配列はジャグ配列よりも高速であると予想していましたが、最後のブロックが最初のブロックの実行時間の 27% しか実行されないことを知って非常に驚きました。
なぜこの大きな違いが生じるのか誰か説明できますか? また、1次元配列を使用することの欠点はありますか(コードの読みやすさ以外に、明らかに難しくなり、エラーを発生させるリスクが高くなる可能性があります)?
コードは最適化されていないビルドで実行されました。最適化されたビルドでは、両方のテストが各反復で 100 ミリ秒未満で実行されますが、これはループ内で実行されるコードにもっと関係があると思います。それでも、1 次元配列はジャグ配列よりも 50% 高速です。