2012-01-11 38 views
6

在很老的項目一個循環過程中的bug修復,我面臨着奇怪的方法,它看起來像這樣:一個空體中的Java

void waiter() { 
     for (int i = 0; i < 20000; i++) ; 
    } 

不會造成停止一段時間,或將被省略JVM優化?

+1

爲什麼喲uever寫了這樣一段...代碼? – 2012-01-11 10:00:40

+0

這不是我的,我剛開始使用這個項目...:D – 2012-01-11 10:01:53

+0

我想爲了暫停執行程序,他正在使用這個邏輯。 ;) – 2012-01-11 10:04:00

回答

2

它可能被優化,它可能不會。取決於編譯器中的優化級別。

變量i的作用域爲循環,所以它在後面將不可用。編譯器能夠靜態標識循環將運行已知次數。它也知道空的陳述重複了很多次。然後,它可以將一些空語句轉換爲一個空語句,或者根本沒有語句。這具有從抽象語法樹中完全刪除代碼的效果。

這將發生在一些優化設置和編譯器下,而不是在其他下面。

+0

你可以用一些文檔來備份它嗎?通過「優化」,你的意思是「刪除」?編譯器遺漏了一些代碼似乎很奇怪。 – 2012-01-11 10:06:53

+0

@ŁukaszBachman最佳的情況是省略該代碼並設置我20000. – holgac 2012-01-11 10:11:25

+0

甚至沒有,因爲'我'的範圍是循環! – Joe 2012-01-11 10:13:25

1

我不知道它是否改變了,我沒有使用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」 替換空循環,這是循環的淨效應。

+0

javac還沒有做過,不做,也從來不會做任何有趣的優化。並且該鏈接顯示了撥號分數測試中的一個。無論設置計數器值的大小如何,您都可以得到相同的結果:在解釋器中運行循環〜10k次,JIT開始執行,並移除循環的其餘部分,而與循環的大小無關。雖然在這種情況下,它似乎是預期的結果。 – Voo 2012-01-11 10:31:44

0

是的,這將是optimised.I've嘗試:d

+0

用什麼編譯器/設置? – 2012-01-11 10:05:05

相關問題