Java内联虚拟方法调用的性能
總覽
動(dòng)態(tài)編譯的好處之一是,它能夠支持在虛擬方法代碼上進(jìn)行廣泛的方法內(nèi)聯(lián)。
雖然內(nèi)聯(lián)代碼可以提高性能,但是代碼仍然必須檢查類型(以防由于優(yōu)化而更改了類型)或在多個(gè)可能的實(shí)現(xiàn)之間進(jìn)行選擇。
這導(dǎo)致了問題。 通過接口調(diào)用的方法的多個(gè)實(shí)現(xiàn)如何影響性能。
標(biāo)桿管理
此基準(zhǔn)測(cè)試了作為列表元素調(diào)用的簡單方法。 它比較列表中不同類的數(shù)量以查看其性能,但還改變了展開循環(huán)的數(shù)量,從而減少了可能的類數(shù)量。 例如,對(duì)于一個(gè)12個(gè)不同類的列表,以重復(fù)的方式,在不展開的情況下,方法調(diào)用可能是12個(gè)類中的任何一個(gè),但是當(dāng)循環(huán)展開到兩個(gè)程度時(shí),每個(gè)調(diào)用只有6個(gè)可能的類(12 / 2)。 展開為三個(gè)級(jí)別時(shí),每個(gè)調(diào)用有12個(gè)(4/3)個(gè)可能的類,對(duì)于展開為六個(gè)級(jí)別的循環(huán),只有兩個(gè)可能的類。 注意:每行代碼可能的類都不相同。
這些是2.5 GHz i5上的結(jié)果。 時(shí)間以納秒為單位。 軸標(biāo)題是指從給定代碼行使用或調(diào)用的不同類的數(shù)量。
| 1二手 | 2二手 | 3二手 | 4二手 | 6二手 | 8二手 | 12使用 | |
| 每個(gè)呼叫站點(diǎn)1個(gè) | 48.4 | 46.6 | 46.9 | 43.7 | 48.7 | 54.9 | |
| 每個(gè)呼叫站點(diǎn)2個(gè) | 115.8 | 80.5 | 92.8 | 87 | 112 | ||
| 每個(gè)呼叫站點(diǎn)3個(gè) | 285 | 283 | 271 | ||||
| 每個(gè)呼叫站點(diǎn)4個(gè) | 669 | 281 | 275 | ||||
| 每個(gè)呼叫站點(diǎn)6個(gè) | 562 | 275 | |||||
| 每個(gè)呼叫站點(diǎn)8個(gè) | 498 | ||||||
| 每個(gè)呼叫站點(diǎn)12個(gè) | 530 |
看起來,加載的類的數(shù)量,甚至列表中的類的數(shù)量,都不如從給定代碼段調(diào)用的可能的類的數(shù)量重要。 同樣,可以循環(huán)地優(yōu)化同一循環(huán)中的不同代碼段。
您會(huì)看到,如果給定調(diào)用只能創(chuàng)建一個(gè)可能的類,則程序中使用的類數(shù)無關(guān)緊要。
另一個(gè)含義是,如果要通過一個(gè)公共接口比較兩個(gè)替代方案,則必須小心如何運(yùn)行測(cè)試,這樣就不會(huì)因?yàn)橹皇褂靡环N類型的事實(shí)而偏愛第一次運(yùn)行。 為了解決這個(gè)問題,我建議; 多次運(yùn)行所有測(cè)試,總共至少2秒鐘。 這樣可以減少與您執(zhí)行測(cè)試的順序相關(guān)的bais。
參考:來自Vanilla Java博客的JCG合作伙伴 Peter Lawrey 在Java中內(nèi)聯(lián)虛擬方法調(diào)用的性能 。
翻譯自: https://www.javacodegeeks.com/2012/12/performance-of-inlined-virtual-method-invocations-in-java.html
總結(jié)
以上是生活随笔為你收集整理的Java内联虚拟方法调用的性能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nvidia控制面板physx选什么好n
- 下一篇: 电脑6位密码忘了(6位密码本忘记密码了怎