Ruby在聖誕節當天,發布了最新的Ruby 3.1.0,這個版本加入新的實驗性程序內JIT編譯器YJIT,能進一步提升許多真實使用案例的效能,在測試工具railsbench和樣板語言liquid-render上的執行速度都非常亮眼,另外,Ruby 3.1.0還加入新的除錯器來提升除錯效能。

Ruby 3.1.0所加入的這個YJIT,是由Shopify開發的程序內編譯器。在2018年的時候,Ruby 2.6加入了MJIT(Method-based JIT),來提升程式效能,而在去年聖誕節,Ruby開發團隊也趕在聖誕節,希望給社群一個聖誕節禮物,宣布實現Ruby3x3,Ruby3x3是由Ruby主要設計人松本行弘(Yukihiro Matsumoto,Matz),對開發團隊設下的目標,希望Ruby 3的速度可以是Ruby 2的3倍。

開發團隊以Ruby 2.0、Ruby 3.0以及Ruby 3.0 JIT來測試Optcarrot基準測試,而結果也顯示Ruby 3.0 JIT的單執行緒效能是Ruby 2.0的3倍,但開發人員通常不會在生產環境中啟用MJIT,官方也提到,儘管Optcarrot基準測試表現讓人印象深刻,但終究並沒有讓現實世界的業務受益。

而最近Shopify貢獻了許多Ruby的更新,來改善他們自家的Rails應用程式,而YJIT便是其中一個重要的貢獻,目的是要提高Rails應用程式的效能。 MJIT的問題在於,應用程式存在大量方法時,使用JIT反而會使執行速度變慢,JIT僅可以提升遊戲、人工智慧或是呼叫少量方法的工作負載效能。原因是,MJIT並沒有針對Rails等,需要大量呼叫方法的工作負載進行最佳化,反而會加重這類工作指令快取(i-cache)丟失的問題,而官方也一直未能解決這個問題。

不同於MJIT是個基於方法的JIT編譯器,並且使用外部C編譯器,YJIT使用基本區塊控制(Basic Block Versioning),並將JIT編譯器包含在其中。由Shopify成員發表,在2021年10月19日所公開的論文,詳細介紹了YJIT這個新方法,這是一個以LBBV(Lazy Basic Block Versioning)架構為基礎,在CRuby內部建構新的JIT編譯器的方法,論文提到,雖然這個編譯器比不上TruffleRuby的高峰效能,但是提供與現有Ruby程式碼接近100%的相容性,而且具有超高速預熱特性,在實際軟體的大型基準測試,提供15%到19%的加速。

獨立重新實作Ruby語言,像是JRuby和TruffleRuby,雖然能夠大幅提升效能,但是在支援語言新功能上,往往落後CRuby,因此限制這些語言的實際應用。YJIT則是一個更通用的Ruby效能解決方案,在相容大部分現有Ruby程式碼的前提,大幅提升程式碼效能。

在實際的軟體中,YJIT實現了快速預熱和效能改進的目標,在railsbench速度提升達22%,而liquid-render則有39%。不過目前YJIT仍是一項實驗性功能,在預設情況下停用,開發者可以在類Unix x86-64平臺上手動開啟。

除了YJIT,Ruby 3.1.0另一項值得關注的更新,是捆綁了一個完全重寫的除錯器debug.gem,這個新的除錯器大幅改善除錯效能,現在即便使用除錯器,也不會減慢應用程式的速度,同時支援遠端除錯,支援VS Code和Chrome瀏覽器等更多除錯前端,並且加入多程序和多執行緒除錯等功能。

Ruby過去綑綁了lib/debug.rb除錯器,但是並沒有得到妥善的維護,在效能和功能上都存在一些問題,而現在debug.gem則完全取代lib/debug.rb。

IRB(Interactive Ruby)互動式命令列工具,現在新增自動完成功能,開發者只需要在其中輸入程式碼,便會出現完成候選對話框,而且當開發者安裝了相關文件,在選擇候選選項時,對話框旁還會出現文件對話框,顯示部分內容。

熱門新聞

Advertisement