Просто взгляните на байт-код с javap -c [ClassName]
. Вот класс, демонстрирующий несколько примеров одноразовых переменных с циклами. Соответствующий дамп байт-кода находится в комментариях:
class HelloWorldLoopsAnnotated {
//
// HelloWorldLoopsAnnotated();
// Code:
// 0: aload_0
// 1: invokespecial #1; //Method java/lang/Object."<init>":()V
// 4: return
////////////////////////////////////////////////////////////////////////////
void stringDeclaredInsideLoop(){
while (true) {
// 0: ldc #2; //String Hello World!
String greeting = "Hello World!";
doNothing(greeting);
}
}
//
// void stringDeclaredInsideLoop();
// Code:
// 0: ldc #2; //String Hello World!
// 2: astore_1
// 3: aload_0
// 4: aload_1
// 5: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 8: goto 0
////////////////////////////////////////////////////////////////////////////
void stringDeclaredOutsideLoop(){
String greeting;
while (true) {
greeting = "Hello World!";
doNothing(greeting);
}
}
//
// void stringDeclaredOutsideLoop();
// Code:
// 0: ldc #2; //String Hello World!
// 2: astore_1
// 3: aload_0
// 4: aload_1
// 5: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 8: goto 0
////////////////////////////////////////////////////////////////////////////
void stringAsDirectArgument(){
while (true) {
doNothing("Hello World!");
}
}
// void stringAsDirectArgument();
// Code:
// 0: aload_0
// 1: ldc #2; //String Hello World!
// 3: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 6: goto 0
////////////////////////////////////////////////////////////////////////////
private void doNothing(String s) {
}
}
stringDeclaredInsideLoop()
и stringDeclaredOutsideLoop()
дают идентичный байт-код из шести инструкций. stringDeclaredInsideLoop()
все еще выигрывает: ограниченная область действия лучше .
После некоторых размышлений я не могу понять, как ужесточение области действия может повлиять на производительность: идентичные данные в стеке потребуют идентичных инструкций.
stringAsDirectArgument()
, однако, определяет операцию только в четырех инструкциях. Среды с нехваткой памяти (например, мой великолепно тупой телефон) могут оценить оптимизацию, в то время как коллега, читающий ваш код, может этого не делать, поэтому будьте осторожны, прежде чем убирать байты из кода.
Подробнее см. .