2011-05-23 43 views
0

下面的代碼片段:爲什麼在使用熱點服務器JVM運行時,此代碼段實際上需要更長的時間?

https://gist.github.com/987751

對於我來說,它得到的時間,如:

 
java -client: 
    for loop took:  23 
    method call took: 19 

java -server: 
    for loop took:  0 # faster, as expected 
    method call took: 48 # slower--expected? 

所以,第一個問題是「爲什麼它比客戶端虛擬機慢」

另外我想下一個問題是「是否有可能獲得方法調用方式的超級0ms加速(它幾乎是相同的代碼)?」

此外,我認爲,儘管這種怪異,一般的熱點運行速度要快得多,即使是匿名類等。

謝謝!

-roger-

+0

相關:http://stackoverflow.com/questions/2423203/server-option-for-java-exe – finnw 2011-05-24 00:53:15

回答

2

它怎麼一回事熱點的兩種口味的調整:

  • 客戶端調整爲快速(ER)的啓動。它JIT編譯方法「幾乎」馬上「。

  • 服務器針對假定爲長調諧服務器實例的生命週期內的高(er)吞吐量進行調整。它可以讓解釋器在JIT編譯之前運行更長的時間(收集使用統計數據)。然後(我相信)它執行更積極的優化......這需要更長的時間。

相關答案:Real differences between "java -server" and "java -client"?

順便說一句,它是運行客戶端和服務器模式是相同的熱點JVM。 AFAIK,不同之處在於兩種模式選擇不同的默認JVM調整/配置參數。


所以,第一個問題是「爲什麼它比客戶端虛擬機慢」

我不知道。

也許客戶端模式可以實現特定的優化,這真的有助於這個(高度人爲的)基準測試。或者,其中一種服務器模式優化實際上是針對此(高度人爲)基準的反優化。如果您真的想知道,請讓JIT編譯器轉儲本機代碼並詳細分析它。 (但我認爲這是浪費時間。)

而且我想下一個問題是「是有可能得到的是超級0毫秒加速比方法調用的方式(這是幾乎相同的代碼)?」

這很簡單。優化器已經發現方法調用不會影響其他任何內容,並且已經優化了該呼叫。循環可以被優化掉。

此外,我認爲,儘管這種怪異,熱點一般跑得快得多,即使有,比如說,匿名類等?

我不認爲你應該推定任何東西。

但是,我也不認爲你的微基準測試對真實程序有任何意義。微基準通常會導致誤導,並且你的是有缺陷的(例如,被優化掉的循環),而且似乎沒有測試一個典型的(寫得很好的)Java程序會做的事情。

如果您真的關心兩種HotSpot模式的相對性能,您應該運行並衡量應用程序在實際數據上的性能。

......爲什麼服務器JVM會選擇一些看起來更糟糕的東西?

優化器旨在優化真正的程序...不是微型基準,他們花時間做奇怪的事情,不會與有用的計算有任何相似之處。並非所有優化在所有情況下都是有益的,並且您可能遇到某種邊緣情況。

但是,這隻有在您看到實際應用程序中發生同樣的事情時才相關。


最後,你不提供任何關於JVM版本,平臺和硬件的細節。這些可能會對相對績效衡量標準產生巨大影響。

+0

那麼爲什麼熱點(看似)從來沒有得到解決這個快速的方式編譯這個特定的部分,這是主要是我的問題。關於客戶實際上是熱點的好點,也可能是客戶在這種情況下做出了更好的編譯選擇?但是,我想知道......爲什麼服務器JVM會選擇看起來更糟糕的東西? – rogerdpack 2011-05-24 00:14:52

+0

這是與Java(TM)SE運行時環境(內部版本1.6.0_24-b07),但我似乎可以用32位jdk(大約相同版本)運行linux重現它。 – rogerdpack 2011-05-24 18:53:42

相關問題