三種提升Java程式碼效能的簡單技巧 - levelup
優先考慮組成而不是繼承、盡一切可能內聯方法、建立小方法是簡單的提升程式碼效能方法:
大多數開發人員會遇到有關Java效能的問題。大多數開發人員不知道正確的答案。這裡提供三種簡單最佳化技巧:
1.內聯Java
內聯方法是JIT編譯器使用的一種最佳化技術。研究表明,其加速比高達93倍。
哪些方法易於內聯?靜態,私有,最終final方法很容易內聯;虛擬呼叫如果是monomorphic單態呼叫,則可以內聯。方法呼叫預設是虛擬的,這意味著您需要搜尋vtable以獲得方法引用,透過一種多型性,您可以為一個方法擁有多個呼叫入口。
可以內聯哪些方法?公開public方法,但必須滿足一些標準方法。方法大小是一項標準。在Linux 64位上,將大小定為325位元組以下的方法可以內聯。小型方法可以內聯,而大型方法則不能。
JIT編譯器如何最佳化單態呼叫?使用內聯快取。預設情況下,只有單態呼叫。發生子類呼叫時,它會分支為megamorphic巨形呼叫。
什麼是巨形呼叫?子類中的重寫方法會導致巨形呼叫。呼叫vtable,就不會產生包含所有可能的方法呼叫的表。
內聯可以為您做什麼?為什麼單態呼叫比多型呼叫更好?讓我們來看看:我們可以使用此基準測試方法的大小最佳化。為了測試方法呼叫的內聯快取,我們可以使用這裡的基準。
不能內聯哪些方法?
如何搜尋未最佳化的方法?使用jarScan限制為325個位元組。該限制可能因平臺而異。此限制是大方法的指標。這是一個大方法的示例。
./jarScan.sh --mode=maxMethodSize --limit=325 ./yourproject.jar "com.yourproject","HugeClass","com.yourproject.HugeClass$Builder",637 |
2.組合如何擊敗繼承
Bimorphic雙態呼叫在行內快取中獲得匹配。我們可以看到,雙態使操作次數提高了35%。
做簡單instanceof可以改善內聯快取中的點選率。最佳化使吞吐量提高了30%。
是什麼使巨形呼叫的執行效果不佳?線上快取中未命中。轉到vtable。遍歷vtable會降低執行速度。
這是多型性的主要問題:
像Java這樣的程式語言提供了多型的便利,作為構造模組化和可重用軟體的方法之一。這種語言選擇自然是有代價的,因為沒有硬體支援虛擬呼叫,因此執行時必須模仿這種行為。— AlekseyShipilёv
單態的效能比雙態的效能高4倍。
透過基準測速表明:內聯方法的效能更好。多型方法的效能比單態方法差。
我們可以瞭解到為什麼合成勝過繼承。繼承為vtable帶來了更多方法,從而導致效能瓶頸。力爭使用較小的方法,這些方法可以內聯並表現更好。
3.小方法快大方法慢?
讓我們從一開始就嘗試我們的基準測試。較小的方法的效能要好26倍。如果我們不內聯較小的方法怎麼辦?內聯方法如何影響平均時間?內聯方法的效能比同類方法好2倍。
我們可以從這些基準中學到什麼?盡一切可能使您的方法內聯。建立較小的方法,並減少專案中現有的較大方法。吞吐量效能取決於大小。小型內聯方法平均快2倍。
相關文章
- Java 中的5個程式碼效能提升技巧,最高提升近10倍Java
- 三種提高Python程式碼效能的簡便方法Python
- 有助於改善效能的Java程式碼技巧Java
- 有效提升Python程式碼效能的三個層面Python
- 好程式設計師Java培訓分享-簡單的效能最佳化技巧程式設計師Java
- 11個簡單的Java效能調優技巧,傻瓜都能學會!Java
- Java 22中三種垃圾回收GC效能獲得了大提升JavaGC
- [java基礎]11個簡單的Java效能調優技巧,傻瓜都能學會Java
- Java中提升效能對程式碼作的建議(轉Mark)Java
- 編寫簡單的Java程式碼:HelloWoridJava
- 6個提升PostgreSQL效能的小技巧SQL
- 5個介面效能提升的通用技巧
- 簡單的辦公技巧,也可以提升你的工作效率
- Java常見排序演算法之插入排序-簡單的效能優化技巧Java排序演算法優化
- 用 100 行程式碼提升 10 倍的效能行程
- 【知識分享】提升伺服器效能的三種負載均衡伺服器負載
- 簡單實現幾種常見的前端效果,附程式碼!前端
- 用100行程式碼提升10倍的效能行程
- JProfiler for Mac/win- 提升Java應用程式的效能利器!MacJava
- 幾行程式碼提升Pandas效能150倍行程
- 十年程式設計經驗總結,三點技巧幫你提升程式碼能力!程式設計
- 使用簡單的Java程式碼實現酒店管理系統Java
- 簡單理解Java中的4種迴圈Java
- 一種簡單快捷的 java 熱部署方式Java熱部署
- jmeter學習指南之Beanshell 呼叫 java 程式碼的三種方式JMeterBeanJava
- 簡單的程式碼生成工具
- 優化Go程式的簡單技巧 - stephen.sh優化Go
- MongoDB最簡單的入門教程之三 使用Java程式碼往MongoDB裡插入資料MongoDBJava
- SPIDR - 完美分割使用者故事的五種簡單技巧
- 程式設計師程式設計時的簡單方法與技巧程式設計師
- 實驗三:在centos裡使用一些簡單的程式碼,CentOS
- 最佳化Go程式的簡單技巧 - stephen.shGo
- 編寫高效能的Java程式碼Java
- GraalVM 21.0提供執行Java程式碼的第三種方式:Espresso通過Truffle框架執行Java程式碼 - graalvmLVMJavaEspresso框架
- 資料預處理速度高倍提升,3行python程式碼簡單搞定!Python
- 簡單的Java二維碼應用Java
- 小程式redux效能優化,提升三倍渲染速度Redux優化
- Flutter 網路請求的三種簡單實現Flutter