Доступ к массиву не медленно, я попробовал эту программу, сравнив время подведения кучи последовательных повторяющихся чисел от 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 мс с использованием массива с зубчатым колесом, 624 мс с использованием матрицы и 486 мс, которые вычисляют числа напрямую.
Я попытался использовать Список, но проблема все еще здесь. Это очень медленно. Список будет лучше для меня, но я не понимаю, как я могу получить указатель в моем случае. –
1. Это массив из массива (массив массивов), а не двумерный массив ('byte [,]'). 2. Вам не нужно гадать. Используйте профайлер, чтобы найти узкое место. – Dmitry
Дмитрий, извините, это зубчато. Но проблемы все еще здесь - когда я удаляю acess по индексу, скорость резко возрастает. –