C# 遍历 3D 数组的最快维度

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)

Gur*_*ron 6

您可以自己进行基准测试,例如:

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 缓存和一些优化,逐行处理项目应该更快(特别是如果您将值类型存储在数组中),但对于大多数日常场景,改进应该很小,并且一如既往 - 对您的具体案例进行基准测试(和具体的硬件)第一。