2012-01-19 4 views
-2

Какая функция более эффективна?Какая функция более эффективна?

int rows=20000; 
int col=30000; 

void func1() { 
    for(i=0;i<rows;i++) { 
     for(j=0;j<col;j++) 
      print(a[i][j]); 
    } 
} 

void func2() { 
    for(j=0;j<col;j++) { 
     for(i=0;i<rows;i++) 
      print(a[i][j]); 
    } 
} 
+2

эффективный с точки зрения чего? – cdeszaq

+0

Кроме того, на каком языке? – cdeszaq

+1

С точки зрения времени – CommonMan

ответ

4

Производительность, вероятно, будет лучше для первой функции, поскольку доступ к данным упорядочен последовательно (или в основном последовательно) в памяти. Это происходит быстрее, потому что чтение в одном месте памяти приведет к смещению соседних мест памяти в кэш, поэтому, когда они будут прочитаны, они будут прочитаны намного быстрее, чем если бы они не были в кеше. _ Причина, по которой все должны знать об этом, заключается в том, что разница в производительности может быть абсолютно драматичной. Около 5 лет назад я работал над оптимизацией производительности проекта, который имел код, как во второй функции. Я смог увеличить скорость некоторых циклов, как и в 10 раз, при программировании на C путем последовательного доступа к памяти.

+0

Порядок массива, хранящийся в памяти (порядок байтов), не обязательно одинаковый для всех систем ... – cdeszaq

+0

@cdeszaq: Это не имеет никакого отношения к порядку байтов. Он имеет отношение к сортировке строк или столбцов на массивах. – parasietje

1

Не зная больше, это зависит от того, как реализованы массивы.

Если массив хранится в строчном порядке, то func1 работает быстрее, если он равен столбцу, то func2 работает быстрее.

Но, как я уже сказал, информации здесь недостаточно, чтобы дать какой-либо хороший ответ.

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