我很好奇一维数组是否比锯齿状数组快,我测量了以下代码块的性能:
测试 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:一维数组
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
另外,我只对数组赋值,然后只从数组读取,运行测试,结果具有相同的比率。
我原以为一维数组比锯齿数组快,但当我看到最后一个块的执行时间仅为第一个块的 27% 时,我感到非常惊讶。
有人可以解释为什么会发生这种巨大的差异吗?使用一维数组是否有任何缺点(除了代码可读性,它显然变得更难了,而且可能会增加出错的风险)?
该代码是在未优化的构建中执行的。在优化构建中,两个测试在每次迭代中都在 100 毫秒内执行,但我认为这与循环内执行的代码有关。尽管如此,一维数组仍然比锯齿状数组快 50%。