2013-06-21 64 views
3

我目前正在調查我們的一個性能測試中的一個奇怪的行爲: 在這個測試中,我執行了一個相當複雜的計算幾次。該測試顯示出一些漸進式行爲。第一次運行是最昂貴的運行之後,大約100次運行執行時間爲1000-5000ns,然後降至10-40ns。由於測試使用隨機生成的值,因此我修改了測試以生成一次數據,然後使用完全相同的數據執行測試。Java VM的加速時間?

爲了消除類加載和其他問題,我甚至執行了一次運行,並添加了一秒的睡眠,以使任何背景的東西有機會完成加載類和其他的東西。

我期望在整個運行過程中有相似的執行時間,並且可以理解由於垃圾回收踢入......而導致性能下降,但看到運行速度越來越快,似乎相當奇怪。

我無法真正解釋這種行爲。虛擬機中是否可以進行某種優化?

克里斯

+0

即時編譯? –

回答

3

此效應是由HotSpot造成的。

HotSpot執行字節碼的運行時執行。

首先它解釋字節碼。這很慢。

如果HotSpot檢測到您的代碼是定期執行的,它會將代碼編譯爲執行代碼的計算機上的本機代碼。這給執行速度帶來了第一次改進。

之後,HotSpot仍在分析您的代碼。如果它經常被調用(是程序的熱點),HotSpot會優化你的代碼。當它確定你的代碼經常運行並且需要很多時間來執行時,這更經常進行。優化越來越激進。

因此,經常執行的代碼會花費很長時間進行優化,如果您的代碼可以優化,它將會進行越來越多的優化。

爲此可以找到白皮書here

+0

好的......聽起來很合理:-)謝謝你的解釋。 –