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