網(wǎng)站制作NEWS
極致性能優(yōu)化
Fury,一款基于JIT動態(tài)編譯的高性能多語言序列化框架,旨在為大多數(shù)類動態(tài)生成序列化代碼,以減少虛方法調(diào)用、條件分支、Hash查找等開銷,從而實現(xiàn)與kryo相比10~40倍的高性能。
在進(jìn)行性能測試時,發(fā)現(xiàn)Fury在處理大對象時的性能提升并未達(dá)到數(shù)十倍的目標(biāo),這可能與JVM JIT編譯與內(nèi)聯(lián)有關(guān)。本文將闡述如何通過分析和優(yōu)化,實現(xiàn)數(shù)十倍性能提升。
分析步驟分為兩部分:首先,通過命令行查看JVM相關(guān)參數(shù),確認(rèn)當(dāng)前使用的JIT編譯器及編譯參數(shù)。在macOS與JDK8環(huán)境下,使用的是默認(rèn)的server模式和分層編譯選項。注意某些不可調(diào)整參數(shù)需查看JDK源碼以獲取詳細(xì)信息。
接著,打開編譯器日志,關(guān)注tiered_level、size和deopt,以檢查編譯過程是否存在異常。使用特定參數(shù)打印JVM JIT編譯日志,日志由五個部分組成,通過分析這些信息,重點關(guān)注Fury生成代碼的最終tier level 4部分,忽略無意義的內(nèi)聯(lián)優(yōu)化信息。
確認(rèn)Fury生成的代碼過大,無法在內(nèi)聯(lián)過程中達(dá)到最優(yōu)狀態(tài)。優(yōu)化策略在于將生成的代碼進(jìn)行拆分,將其轉(zhuǎn)換為多個小方法,再在其他方法中調(diào)用這些小方法。這一過程需要基于規(guī)則對表達(dá)式樹進(jìn)行切割,為每個子樹生成單獨的方法,并在表達(dá)式樹的父類節(jié)點調(diào)用相關(guān)方法。面對的主要挑戰(zhàn)在于如何高效地進(jìn)行代碼拆分與調(diào)用。
在優(yōu)化后,JIT日志顯示幾乎所有代碼已被完全內(nèi)聯(lián),達(dá)到了預(yù)期的優(yōu)化效果。在處理大對象場景時,此類優(yōu)化能夠?qū)崿F(xiàn)數(shù)十倍的性能提升。
歡迎參與Fury社區(qū),無論是提問、代碼貢獻(xiàn)還是技術(shù)討論,都對項目發(fā)展至關(guān)重要。期待您的參與,共同推動項目向前發(fā)展,打造最先進(jìn)序列化框架。
多重隨機(jī)標(biāo)簽