繁体   English   中英

快速不安全地访问二维数组

[英]Fast unsafe access for two dimension array

我有一个巨大的二维数组。 我需要从中获取元素,但是我有一个问题-它的运行速度极慢(我认为从编译器检查索引时出现问题)。 我如何不安全地获取数组元素?

private byte[][] MY_TASTE_ARRAY;

for (int d = 0; d < MANY_TIMES; d++)
{      
   int a = MY_TASTE_ARRAY[first_index][second_index];
   MakeSomethingWitha(a);
}

数组访问并不慢,我尝试了该程序,比较了直接将一堆连续重复的数字从0到255相加或将它们放入锯齿数组或矩阵中的时间:

        const int N = 10000;
        var jagged = new byte[ N ][];
        var matrix = new byte[ N, N ];
        var count = (byte)0;
        for (var i=0; i< N;  i++ )
        {
            jagged[ i ] = new byte[ N ];
            for ( var j = 0; j < N; j++ )
            {
                jagged[ i ][ j ] = count;
                matrix[ i, j ] = count;
                count = count == 255 ? 
                    (byte) 0 : 
                    (byte) ( count + 1 );
            }
        }
        var watch = new Stopwatch();

        watch.Start();
        var total = 0;
        for ( var i = 0; i < N; i++ )
        {
            for ( var j = 0; j < N; j++ )
            {
                total += jagged[ i ][ j ];
            }
        }
        watch.Stop();
        Console.WriteLine( "Total with jagged array: {0} in {1} ms", total, watch.ElapsedMilliseconds );

        watch.Restart();
        total = 0;
        count = (byte)0;
        for ( var i = 0; i < N; i++ )
        {
            for ( var j = 0; j < N; j++ )
            {
                total += matrix[ i, j ];
            }
        }
        watch.Stop();
        Console.WriteLine( "Total with matrix: {0} in {1} ms", total, watch.ElapsedMilliseconds );

        watch.Restart();
        total = 0;
        count = (byte)0;
        for ( var i = 0; i < N; i++ )
        {
            for ( var j = 0; j < N; j++ )
            {
                total += count;
                count = count == 255 ?
                    (byte)0 :
                    (byte)( count + 1 );
            }
        }
        watch.Stop();
        Console.WriteLine( "Total without array: {0} in {1} ms", total, watch.ElapsedMilliseconds );

使用锯齿形数组的结果为497 ms,使用矩阵的结果为624 ms,直接计算数字为486 ms。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM