다른 데이터 구조에서 일부 벤치 마크를 실행 중이었고 최종 변수를 선언했을 때 성능이 10-20 % 향상되었습니다.Java 최종 성능/최적화
정말 놀라웠습니다. 나는 최종 키워드가 순전히 변수의 변화를 제한하는 데 사용되고 최적화가 어떤 변수가 일정한 값을 가졌는지 아닌지를 알아낼 것이라고 생각했다.
마지막으로import javafx.scene.input.KeyCode;
import java.util.*;
public class Main {
static /*final*/ int LOOPS = Integer.MAX_VALUE/100;
static /*final*/ KeyCode[] keyCodes = KeyCode.values();
public static void main(String[] args) {
long startTime;
long endTime;
testEnumSet(); //warmup
startTime = System.nanoTime();
testEnumSet();
endTime = System.nanoTime();
System.out.println(" EnumSet: " + (endTime - startTime) + "ns");
}
static /*final*/ EnumSet<KeyCode> enumSet = EnumSet.noneOf(KeyCode.class);
static void testEnumSet() {
for (int i = 0; i < LOOPS; i++) {
/*final*/ KeyCode add = getRandomKeyCode();
if(!enumSet.contains(add)) enumSet.add(add);
/*final*/ KeyCode remove = getRandomKeyCode();
if(enumSet.contains(remove)) enumSet.remove(remove);
}
}
/*final*/ static Random random = new Random();
static KeyCode getRandomKeyCode() {
return keyCodes[random.nextInt(keyCodes.length)];
}
}
: .... EnumSet: 652 266 207ns
최종없이 : EnumSet: 802 121 596ns
이 일관되게 재현 여기
은 예입니다!왜 final을 사용하는 코드와 그렇지 않은 코드간에 엄청난 차이가 있습니까? 최적화되지 않는 이유는 무엇입니까? 그리고 어쨌든 최종 결과가 더 빠른 이유는 무엇입니까? 생성 된 바이트 코드의 차이점은 무엇입니까?
[중복 (http://stackoverflow.com/questions/4279420/does-use-of-final-keyword-in-java-improve-the-performance?rq=1) –
@ JarrodRoberson의 최고 정답은 성능 향상이 없지만 내 벤치 마크는 ~ 20 %의 성능 향상을 보여 주므로 중복되지는 않습니다. – Jhonny007
최고 평점은 항상 평균을 의미하지 않습니다 * 올바른 * 때로는 대부분의 사람들이 잘못되었음을 의미합니다. 결과가 항상 재현 가능하지는 않으며 '최종'가 항상 측정 가능한 이익을 부여하지는 않는 것처럼 말입니다. –