Я только что натолкнулся на этот, казалось бы, безобидный комментарий , сравнивая ArrayList с необработанным массивом String.Это было пару лет назад, но ОП пишет
Я заметил, что использование для String s: stringsList было примерно на 50% медленнее, чем использование цикла for в старом стиле для доступа к списку.Пойди разберись ...
Никто не прокомментировал это в оригинальном посте, и тест показался немного сомнительным (слишком коротким, чтобы быть точным), но я чуть не упал со стула, когда читал его,Я никогда не сравнивал расширенный цикл с «традиционным» циклом, но в настоящее время я работаю над проектом, который выполняет сотни миллионов итераций над экземплярами ArrayList, используя расширенные циклы, так что это меня беспокоит.
Я собираюсь сделать несколько тестов и опубликовать свои результаты здесь, но это, очевидно, большая проблема для меня.Я мог бы найти в интернете очень мало информации об относительной производительности, за исключением нескольких случайных упоминаний о том, что улучшенные циклы для ArrayLists действительно работают намного медленнее под Android .
Кто-нибудь испытывал это?Такой разрыв в производительности все еще существует?Я опубликую свои выводы здесь, но был очень удивлен, прочитав это.Я подозреваю, что если бы этот разрыв в производительности действительно существовал, он был исправлен в более современных виртуальных машинах, но я думаю, теперь мне придется провести некоторое тестирование и подтвердить.
Обновление: Я сделалнекоторые изменения в моем коде, но уже подозревал, что другие здесь уже указали: конечно, расширенный цикл медленнее, но за пределами очень тривиальных замкнутых циклов, стоимость должна быть незначительной долей стоимости логики цикла,В моем случае, даже несмотря на то, что я перебираю очень большие списки строк, используя расширенные циклы, моя логика внутри цикла достаточно сложна, чтобы я даже не мог измерить разницу после перехода на циклы на основе индекса.
TL; DR: расширенные циклы действительно медленнее, чем традиционные циклы на основе индекса для массива;но для большинства приложений разница должна быть незначительной.