2013-03-09 3 views
-6

Что лучше в работе, этот цикл:Вложенные циклы производительность

for (int i = 0; i < 100; i++) { 
    for (int j = 0; j < 10; j++) { } 
} 

или этот цикл:

for (int i = 0; i < 10; i++) { 
    for (int j = 0; j < 100; j++) { } 
} 

и почему?

+3

Почему бы вам не проверить его и не увидеть? Я проигнорировал, потому что ваш вопрос должен был быть «* Этот * код быстрее, можете ли вы помочь мне понять, почему?» –

+4

ваш первый код синтаксически неверен ..! –

+0

Что заставляет вас думать, что существует значительная разница? – meriton

ответ

3

Предположим, что внутренний контур фактически что-то делает. Конечно, FredrikRedin и niculare верны, что количество внутренних циклов будет одинаковым. Учитывая, что это так, второй пример является предпочтительным (слегка), потому что второй пример должен настроить внутренний цикл десять раз, тогда как первый устанавливает внутренний цикл 100 раз. Общее число циклов настройки:

  • Первый пример: 101
  • Второй пример: 11

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

+1

Вы имеете в виду обратное, не так ли? Первый пример имеет 100 итераций и 100 раз устанавливает внутренний цикл. –

+0

Правда. Будет редактировать, вы, конечно, правильно. – angelatlarge

+0

"* Поскольку настройка циклов занимает время *" => почему? вы можете уточнить? – assylias

0

На самом деле они выполняют одинаковое количество итераций, потому что '*' является коммутативным. В первом случае число итераций будет 100*10, а во втором случае оно будет 10*100, поэтому оба возобновляются до 1000 итераций.

0

Его одинаковое количество операций. Если у вас нет логики пропускать итерации и/или или любую из двух циклов (break/continue), почему вы ожидаете разницы в производительности?

0

Я не думаю, что они имеют одинаковое представление. Причина - предсказание ветвей.

+0

Можете ли вы немного рассказать о своих мыслях. Почему предсказание ветвления должно быть разным в 2 циклах? –

+0

Это не имеет смысла: в коде есть только одна ветка. – assylias

+0

Если вы посмотрите на код сборки, вы поймете, что есть несколько ветвей ... есть ветка каждый раз, когда вы сравниваете два индекса (i и j) с 9 и 99 ... – salvo

0

Это то же самое, но в атомные времена 10 * 100 лучше, потому что первый итератор включил 100 подтераторов и изменение следующего итератора на 10 шагов и лучше, чем 100 шагов. Для получения наилучших результатов вы можете использовать Atomic Integer или byte для замены int. int - 32 бит, а byte - 8 бит.

0

Эмпирические дает доказательство они примерно одинаково:

(время в миллисекундах с минималистской операцией в цикле)

первой 1003, второе 1113
первого 1012, второго 1001
первые 1000, второй 1002
fi первые 1001, второй 1006
первого 1013, второго 1001
первых 1001, второй 1001
первого 1007, второй +1027
первого 1018, второго 1001
первая 1001, вторая тысяча два
первые 1001, второй 1001
первые 1001, второй 1001
первые 1002, второй 1000

Теоретически, я иду с ответом angelatlarge «ы. Я полагаю, что это зависит от того, что внутри петель: если вы строите новые объекты и т. Д. Сотни раз будет медленнее десятков раз.

+0

Результат зависит от того, сколько раз вы их запускаете - если вы включаете их в метод и много раз вызываете этот метод, очень вероятно, что время упадет до 0. – assylias

+0

@assylias Легко получить время до 0, когда петли пусты, поскольку код оптимизирован (происходит в первый раз). Я гарантирую, что время не упадет до 0, если у вас есть Thread.sleep (1) в цикле/с! – xagyg

0

Как javac-компилятор (который скомпилирует Java-код для байт-кода), так и JIT (который компилирует байт-код для сборки) разрешено обрабатывать обе петли как no-op (которые они есть, поскольку в телах петель нет ничего).

На практике маловероятно, что javac сделает это, но очень вероятно, что JIT просто пропустит этот фрагмент кода.

Итог: производительность java-кода чрезвычайно зависит от контекста и для вашего конкретного вопроса относительно циклов, которые ничего не делают, ответ таков: обе версии, скорее всего, будут пропущены и запущены в кратчайшие сроки.

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