在很老的項目一個循環過程中的bug修復,我面臨着奇怪的方法,它看起來像這樣:一個空體中的Java
void waiter() {
for (int i = 0; i < 20000; i++) ;
}
不會造成停止一段時間,或將被省略JVM優化?
在很老的項目一個循環過程中的bug修復,我面臨着奇怪的方法,它看起來像這樣:一個空體中的Java
void waiter() {
for (int i = 0; i < 20000; i++) ;
}
不會造成停止一段時間,或將被省略JVM優化?
它將由JIT幾運行後進行優化。 JVM在第一次運行時需要檢查是否正在增加的值i
未在任何地方使用。
檢查本文以及:
它可能被優化,它可能不會。取決於編譯器中的優化級別。
變量i
的作用域爲循環,所以它在後面將不可用。編譯器能夠靜態標識循環將運行已知次數。它也知道空的陳述重複了很多次。然後,它可以將一些空語句轉換爲一個空語句,或者根本沒有語句。這具有從抽象語法樹中完全刪除代碼的效果。
這將發生在一些優化設置和編譯器下,而不是在其他下面。
我不知道它是否改變了,我沒有使用Java 2年,但它似乎並沒有。
http://www.herongyang.com/JVM/Benchmark-Int-Empty-Loop-16-Nanosecond.html http://www.herongyang.com/JVM/Benchmark-Long-Empty-Loop-25-Nanosecond.html
該測試也證實了Java字節碼編譯器 「的javac」 是而不是 進行任何優化以用「i = steps」 替換空循環,這是循環的淨效應。
javac還沒有做過,不做,也從來不會做任何有趣的優化。並且該鏈接顯示了撥號分數測試中的一個。無論設置計數器值的大小如何,您都可以得到相同的結果:在解釋器中運行循環〜10k次,JIT開始執行,並移除循環的其餘部分,而與循環的大小無關。雖然在這種情況下,它似乎是預期的結果。 – Voo 2012-01-11 10:31:44
是的,這將是optimised.I've嘗試:d
用什麼編譯器/設置? – 2012-01-11 10:05:05
爲什麼喲uever寫了這樣一段...代碼? – 2012-01-11 10:00:40
這不是我的,我剛開始使用這個項目...:D – 2012-01-11 10:01:53
我想爲了暫停執行程序,他正在使用這個邏輯。 ;) – 2012-01-11 10:04:00