Както винаги за производителността: напишете най-простия код, който можете, и го тествайте, за да видите дали работи достатъчно добре.
Ако имате нужда само от елемента (а не от индекса), бих ви насърчил да използвате подобрения цикъл за:
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