我有一個簡單的類用於說明目的:爲什麼Java編譯器沒有優化一個簡單的方法?
public class Test {
public int test1() {
int result = 100;
result = 200;
return result;
}
public int test2() {
return 200;
}
}
由編譯器(由javap -c Test.class
檢驗)所產生的字節碼如下:
public int test1();
Code:
0: bipush 100
2: istore_1
3: sipush 200
6: istore_1
7: iload_1
8: ireturn
public int test2();
Code:
0: sipush 200
3: ireturn
爲什麼不編譯器優化test1
方法生成的相同字節碼爲test2
方法?我認爲它至少可以避免result
變量的冗餘初始化,因爲很容易得出結論:根本沒有使用100
的值。
我用Eclipse編譯器和javac
都觀察到了這一點。
javac
版本:1.8.0_72
,作爲JDK的一部分的Java一起安裝:
Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode)
* Java語言規範*不需要像這樣的任何優化,所以說「編譯器」就好像只有一個是沒有意義的。你應該指出你正在使用的編譯器。 – ruakh
經典答案是優化在JVM中完成(http://stackoverflow.com/questions/5981460/optimization-by-java-compiler) – wero
@ruakh好評;添加編譯器信息。 –