Dyn*_*uel 2 c# performance multidimensional-array
我有一个 3D 多维数组,大小为 20、240 和 20。
var stuff = new Stuff[20, 240, 20]
Run Code Online (Sandbox Code Playgroud)
我应该以哪个顺序遍历数组以获得最佳性能?
目前我正在做: X, Z, Y 在嵌套的 for 循环中,因为这似乎是我其他人使用的。
for (byte x = 0; x < 20; x++)
for (byte z = 0; z < 20; z++)
for (byte y = 0; y < 240; y++)
Run Code Online (Sandbox Code Playgroud)
您可以自己进行基准测试,例如:
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<Traversal>();
Run Code Online (Sandbox Code Playgroud)
在我的电脑上,它给出了下一个结果:
| Method | Mean | Error | StdDev |
|------- |---------:|---------:|---------:|
| XYZ | 412.4 us | 9.73 us | 27.92 us |
| XZY | 429.0 us | 11.48 us | 33.50 us |
Run Code Online (Sandbox Code Playgroud)
正如CLI 规范规范所述:
数组元素应按行优先顺序排列在数组对象中(即,与最右边的数组维度相关联的元素应从最低到最高索引连续排列)。为每个数组元素分配的实际存储可以包括特定于平台的填充。
所以一般来说,由于CPU 缓存和一些优化,逐行处理项目应该更快(特别是如果您将值类型存储在数组中),但对于大多数日常场景,改进应该很小,并且一如既往 - 对您的具体案例进行基准测试(和具体的硬件)第一。