2015-09-14 1 views
1

Предоставлено a гораздо больше, чем b, будетЭффективность вложенных для петель с очень разными подсчетов

for (i = 0; i < a; i++) 
    for (k = 0 k < b; k++) 

быстрее, чем

for (i = 0; i < b; i++) 
    for (k = 0 k < a; k++) 

Он чувствует ко мне бывший будет быстрее, но я Кажется, я не могу об этом подумать.

+0

Это зависит от того, что внутри цикла, не так ли? Вам нужно показать, что вы планируете запускать внутри рассматриваемых циклов. –

+1

Это разница между 'a * b' и' b * a' - ничего. – Blorgbeard

+0

@Blorgbeard Это не может быть ничего, если содержимое цикла включает в себя доступ к 'foo [i] [k]', например, и один порядок вызывает итерацию столбца-майора (которая медленнее). Но, это действительно зависит от особенностей того, что делается в цикле. –

ответ

2

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

[0] [1] [2]

[3] [4] [5]

[6] [7] [8]

действительно [0] [1 ] [2] [3] [4] [5] [6] [7] [8] в памяти.

Кэш вашего компьютера обеспечивает большее преимущество, когда доступ к памяти близко друг к другу и происходит последовательно, хотя память, а не пропуск через строки, обеспечивает гораздо большую локальность.

1

Запуск цикла требует усилий; есть сама переменная цикла плюс al переменные, объявленные в цикле, которые все выделены и помещены в стек.

Это означает, что меньшее количество раз вы ввести петлю, тем лучше, так что петлю на меньшего диапазона в внешней петли.

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