匿名用户
您可以自己对其进行基准测试,例如:public class Traversal
{
public static int[,,] stuff = new int[20,240,20];
[Benchmark]
public int[,,] XYZ()
{
var result = new int [20, 240, 20];
for (byte x = 0; x < 20; x++)
for (byte y = 0; y < 240; y++)
for (byte z = 0; z < 20; z++)
{
result[x, y, z] = stuff[x, y, z];
}
return result;
}
[Benchmark]
public int[,,] XZY()
{
var result = new int [20, 240, 20];
for (byte x = 0; x < 20; x++)
for (byte z = 0; z < 20; z++)
for (byte y = 0; y < 240; y++)
{
result[x, y, z] = stuff[x, y, z];
}
return result;
}
}
BenchmarkRunner.Run();
在我的计算机上,它给出了下一个结果:| Method | Mean | Error | StdDev |
|------- |---------:|---------:|---------:|
| XYZ | 412.4 us | 9.73 us | 27.92 us |
| XZY | 429.0 us | 11.48 us | 33.50 us |
如CLI spec spec所述:
数组元素应在数组对象内按主要行顺序排列(即,与最右边数组维度相关联的元素应从最低到最高索引连续排列)。 为每个数组元素分配的实际存储可以包括特定于平台的填充。
因此,通常情况下,由于CPU缓存和可能的一些优化,按行处理项的速度应该更快(尤其是如果您将值类型存储在数组中),但对于大多数日常场景,改进应该很小,并且一如既往--首先对具体案例(和具体硬件)进行基准测试。