Путаница в петлях в Java - PullRequest
       0

Путаница в петлях в Java

0 голосов
/ 18 декабря 2011

Какой из них быстрее в Java?

a)  for(int i = 100000; i > 0; i--) {}
b)  for(int i = 1; i < 100001; i++) {}

Я искал объяснение ответа, который является вариантом а, кого-нибудь?любая помощь приветствуется

Ответы [ 4 ]

7 голосов
/ 18 декабря 2011

Бывают ситуации, когда обратный цикл может быть немного быстрее в Java. Вот тест , показывающий пример. Как правило, различие объясняется подробностями реализации в инструкциях увеличения / уменьшения или в инструкциях сравнения завершения цикла, как в контексте базовой архитектуры процессора. В более сложных примерах обращение цикла может помочь устранить зависимости и, таким образом, включить другие оптимизации или улучшить локальность памяти и кэширование, даже поведение сборки мусора.

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

В любом случае, это тот тип микрооптимизации, который может затруднить чтение кода без заметного повышения производительности. И поэтому лучше избегать их, если в этом нет особой необходимости, помните - «преждевременная оптимизация - корень всего зла».

2 голосов
/ 18 декабря 2011

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

1 голос
/ 18 декабря 2011

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

(также HotSpot (по крайней мере, вариант Server / C2) способен удалять пустые циклы.)

0 голосов
/ 18 декабря 2011

Вы сказали, что ответ так, я думаю, ответ: виртуальная машина Java "переведет" сравнение с нуля более быстрым способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...