История изменений
Исправление
izzholtik,
(текущая версия)
:
Фигня в том, что ТС даже приблизительно не понимает, как работает то, что он тестирует, поэтому все его тесты - шлак.
Во-первых, for (как и foreach, лул) компилируется в совершенно разный код в зависимости от аргумента - для массива один, для интерфейса другой, для класса третий. ТС в своих тестах покрывает только один вариант.
Во-вторых, for полагается на итератор переданного объекта, соответственно, ТС замеряет производительность не цикла, а одной из библиотечных реализаций итератора.
В-третьих, foreach - это не конструкция языка, а метод, встроенный добрыми дядями в ArrayList. У разных коллекций он может работать совершенно по-разному. Кроме того, он использует всё тот же итератор (а ещё неявно созданный Consumer), так что по факту ТС замеряет скорость работы одной из библиотечных коллекций.
Ну и да, на разных JVM, ОС и платформах один и тот же байткод может совершенно по-разному JIT'иться и работать с разной скоростью.
Так что специально для ТС повторяю: либо
Читайте байткод jvm
, благо тулза для его просмотра есть в JDK из коробки, либо вон из профессии.
Исправление
izzholtik,
:
Фигня в том, что ТС даже приблизительно не понимает, как работает то, что он тестирует, поэтому все его тесты - шлак.
Во-первых, for (как и foreach, лул) компилируется в совершенно разный код в зависимости от аргумента - для массива один, для интерфейса другой, для класса третий. ТС в своих тестах покрывает только один вариант.
Во-вторых, for полагается на итератор переданного объекта, соответственно, ТС замеряет производительность не цикла, а одной из библиотечных реализаций итератора.
В-третьих, foreach - это не конструкция языка, а метод, встроенный добрыми дядями в ArrayList. У разных коллекций он может работать совершенно по-разному. Кроме того, он использует всё тот же итератор (а ещё неявно созданный Consumer), так что по факту ТС замеряет скорость работы одной из библиотечных коллекций.
Ну и да, на разных JVM, ОС и платформах один и тот же байткод может совершенно по-разному JIT'иться и работать с разной скоростью.
Так что специально для ТС я повторя: либо
Читайте байткод jvm
, благо тулза для его просмотра есть в JDK из коробки, либо вон из профессии.
Исходная версия
izzholtik,
:
Фигня в том, что ТС даже приблизительно не понимает, как работает то, что он тестирует, поэтому все его тесты - шлак.
Во-первых, for (как и foreach, лул) компилируется в совершенно разный код в зависимости от аргумента - для массива один, для интерфейса другой, для класса третий. ТС в своих тестах покрывает только один вариант.
Во-вторых, for полагается на итератор переданного объекта, соответственно, ТС замеряет производительность не цикла, а одной из библиотечных реализаций итератора.
В-третьих, foreach - это не конструкция языка, а метод, встроенный добрыми дядями в ArrayList. У разных коллекций он может работать совершенно по-разному. Кроме того, он использует всё тот же итератор (а ещё неявно созданный Consumer), так что по факту ТС замеряет скорость работы одной из библиотечных коллекций.
Так что специально для ТС я повторя: либо
Читайте байткод jvm
благо тулза для его просмотра есть в JDK из коробки, либо вон из профессии.