Как всегда для производительности: напишите самый простой код, какой сможете, и протестируйте его, чтобы убедиться, что он работает достаточно хорошо.
Если вам нужен только элемент (а не индекс), я бы посоветовал вам использовать расширенный цикл for:
for (int value : array) {
...
}
Согласно JLS 14.14.2 это в основном эквивалентно вашему первому фрагменту кода, но код говорит только о том, что вас действительно интересует.
Но если вам действительно нужен индекс и предполагается, что вы нигде не изменяете array
, я полагаю, что JIT-компилятор оптимизирует собственный код, чтобы получить длину только один раз. Получение длины — это операция O(1), поскольку в основном это просто поле в массиве, но, очевидно, это требует обращения к памяти, поэтому для событийного кода лучше сделать это только один раз. . но это не значит, что ваш код должен это делать. Обратите внимание, что я не ожидаю, что компилятор Java (javac
) выполнит эту оптимизацию — я ожидаю, что это сделает JIT.
На самом деле, я считаю, что хороший JIT действительно увидит такой код:
for (int i = 0; i < array.length; i++) {
int value = array[i];
...
}
и иметь возможность оптимизировать проверки границ массива - он может распознать, что если он все время обращается к одному и тому же объекту массива, это не может привести к ошибке с ошибкой границ массива, поэтому он может избежать проверки. Он может сделать то же самое для более "умного" кода, который заранее выбирает длину, но оптимизация JIT часто преднамеренно нацелена на очень распространенные шаблоны кода (чтобы получить наибольшую "отдачу от вложенных средств" ), а описанный выше способ перебора массива очень распространен.
person
Jon Skeet
schedule
10.06.2015
i<length
вместоi < someArray.length;
? - person TheLostMind   schedule 10.06.2015