Быстрая итерация по трехмерному массиву с небезопасным кодом? - PullRequest
1 голос
/ 14 марта 2011

У меня есть фрагмент кода, в котором я перебираю огромный трехмерный массив с двумя циклами for. Теперь у меня проблемы с производительностью, это слишком медленно. Что я могу сделать?

Я где-то читал, что неуправляемый код может решить проблему. Правильно ли я понял: неуправляемый код работает вне движка .net?

Ну, я поставил небезопасный блок вокруг моих итераций массива, но это не помогло. Я думаю, это потому, что я все еще использую управляемый массив. Как я могу скопировать мой массив в небезопасный массив или получить небезопасный указатель на этот массив? Я попытался исправить (см. Код ниже), но я получаю ошибки компилятора.

        byte[, ,] data = original.Data;
        unsafe
        {
            fixed (byte*** dataPtr = (byte***)data)  // data is of type byte[,,]
            {
                for (int i = original.Rows - 1; i >= 0; i--)
                {
                    for (int j = original.Cols - 1; j >= 0; j--)
                    {
                        if (dataPtr[i,j,0] < 100)
                        {
                           dataPtr[i, j, 0] += 100;
                           dataPtr[i, j, 1] += 40;
                           dataPtr[i, j, 2] += 243;
                        }
                        else
                        {
                           dataPtr[i,j,0] = 0;
                        }
                    }
                }
            }

        }

Как я могу использовать это фиксированное ключевое слово в трехмерном массиве и поможет ли это сделать мой код быстрее?

1 Ответ

2 голосов
/ 16 марта 2011

Если вам нужна скорость, вы не используете многомерный массив.Вам необходимо использовать byte[][][] зубчатый массив, который сильно оптимизирован в CLR.Это единственное изменение, скорее всего, ускорит ваши циклы настолько, что вам больше ничего не нужно делать.

...