В школе мне говорили, что изменять индексную переменную цикла for
:
Пример:
for(int i = 0 ; i < limit ; i++){
if(something){
i+=2; //bad
}
if(something){
limit+=2; //bad
}
}
Аргумент - плохая практика. заключалась в том, что некоторая оптимизация компилятора может оптимизировать цикл и не пересчитывать индекс и привязку в каждом цикле.
Я провел несколько тестов в java
, и кажется, что по умолчанию index и привязка пересчитываются каждый раз.
Мне интересно, можно ли активировать эту функцию в JVM HotSpot
?
Например, чтобы оптимизировать этот вид цикла:
for(int i = 0 ; i < foo.getLength() ; i++){ }
без необходимо написать:
int length = foo.getLength()
for(int i = 0 ; i < length ; i++){ }
Это просто пример, мне любопытно попробовать и увидеть улучшения.
РЕДАКТИРОВАТЬ
Согласно ответу Питера Лоури , почему в этом простом примере JVM не встроена getLenght ()
метод? :
public static void main(String[] args) {
Too t = new Too();
for(int j=0; j<t.getLength();j++){
}
}
class Too {
int l = 10;
public Too() {
}
public int getLength(){
//System.out.println("test");
return l;
}
}
На выходе "test" печатается 10 раз.
Я думаю, было бы неплохо оптимизировать этот вид выполнения.
РЕДАКТИРОВАТЬ 2: Кажется, я неправильно понял ...
Я удалил println
, и профилировщик действительно сказал мне, что метод getLength ()
в этом случае даже не вызывается.