最快的阵列寻址

Max*_* Z. 11 c# arrays performance pointers multidimensional-array

我在存储有关图像信息的数组上运行图像分析代码.不幸的是,代码非常繁重,平均需要25秒来运行单帧.我看到的主要问题是数组寻址.哪个是运行2d阵列最快的,并且完全没有任何差异

水平然后垂直

for (int y = 0; y < array.Length; ++y)
    for (int x = 0; x < array[].Length; ++x)
        //Code using array[y][x]
Run Code Online (Sandbox Code Playgroud)

和垂直然后horrizontal?

for (int x = 0; x < array[].Length; ++x)
    for (int y = 0; y < array.Length; ++y)
        //Code using array[y][x]
Run Code Online (Sandbox Code Playgroud)

此外,我试图避免直接寻址和使用指针.

for (int y = 0; y < array.Length; ++y)
    int* ptrArray = (int*)array[0];
    for (int x = 0; x < array[].Length; ++x, ++ptrArray)
        //Code using ptrArray for array[y][x]
Run Code Online (Sandbox Code Playgroud)

要么

for (int x = 0; x < array[].Length; ++x)
    int* ptrArray = (int*)array[0];
    for (int y = 0; y < array.Length; ++y, ptrArray += array[].Length)
        //Code using ptrArray for array[y][x]
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏.马克斯

Sha*_*hai 3

一种选择是使用反向循环(for() looparray.Length下到 0 开始)

这会加快速度。

例如,

for (int x = array[].Length-1; x >= 0; --x)
    int* ptrArray = (int*)array[0];
    for (int y = array.Length-1; y >= 0 ; --y, ptrArray += array[].Length)
        //Code using ptrArray for array[y][x]
Run Code Online (Sandbox Code Playgroud)

  • 该链接适用于java;JIT(不是 C# 的一部分,而是:VM)通常可以发现常规向量“for”循环并删除边界检查等...我个人认为这需要更清晰的分析来支持它。 (4认同)