2015-09-19 5 views
0

У меня огромный массив измерений. Мне нужно получить элементы от него, но у меня есть проблема - это EXTREMLY slow (я думаю, проблема в проверке индексов из компилятора). Как я могу получить элементы моего массива в небезопасных?Быстрый небезопасный доступ для двухмерного массива

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

Я попытался использовать Список , но проблема все еще здесь. Это очень медленно. Список будет лучше для меня, но я не понимаю, как я могу получить указатель в моем случае. –

+1

1. Это массив из массива (массив массивов), а не двумерный массив ('byte [,]'). 2. Вам не нужно гадать. Используйте профайлер, чтобы найти узкое место. – Dmitry

+0

Дмитрий, извините, это зубчато. Но проблемы все еще здесь - когда я удаляю acess по индексу, скорость резко возрастает. –

ответ

0

Доступ к массиву не медленно, я попробовал эту программу, сравнив время подведения кучи последовательных повторяющихся чисел от 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 мс, которые вычисляют числа напрямую.

+0

ОП не задал вопрос о медленном использовании двухмерного/зубчатого массива. –

+0

Но ОП имеет проблему X-Y. Отвечая на вопрос OP, вопрос на самом деле не решит его проблему. – MrPaulch

+0

Но ваш ответ не решает никаких проблем. Это просто комментарий по этому вопросу. –

 Смежные вопросы

  • Нет связанных вопросов^_^