程式語言Ruby團隊在聖誕節的當天,發布了Ruby 2.6正式版,釋出了主打的功能JIT(Just-In-Time)編譯器,而這是Ruby團隊歷經一年的努力結晶。

JIT允許像是Ruby這樣的直譯語言,最佳化頻繁執行的方法(Method),以便在未來呼叫時,可以運作的更加快速。雖然實作方法在每個語言中都不相同,但一般來說,JIT的目標是跳過方法部分或是全部的直譯步驟。

由於Ruby之父松本行弘為團隊設定了一個目標,希望Ruby 3的應用程式執行速度可以是現在Ruby的3倍,這個計畫被稱為Ruby 3x3。在這個目標設定之後,Ruby已經在諸多地方改善效能,但仍然遠遠不夠,而將JIT加入Ruby則是一個最可能達成目標的做法。

從11月RubyConf的演講中,釋出的資料顯示,Ruby使用新的—jit選項,在熱門的optcarrot基準測試中的表現,Ruby 2.6與Ruby 2.5相比,執行效率的確獲得大幅提升打1.8倍。不過,JIT目前看來似乎是一個雙面刃,因為他也造成其他替代基準測試,例如Rails與Sidekiq的效能下降。

Heroku開發者推廣工程師Jonan Scheffler表示,由於Rails具有大量頻繁呼叫的方法,在使用MJIT(Method-based JIT)時將會遭遇效能降低的情況,因為最佳化單一方法的過程,比實際直譯該方法還要慢,而理想情況,這種效能降低的情況,將會因呼叫經過編譯的方法漸增的效能吸收,但對於大量方法來說,這種效能降低的影響太過巨大。

由於這些編譯都是在首次呼叫時發生,所以理論上一旦應用程式經預熱之後,執行速度應該要提升,但是這些方法每一個最初都需要消耗大約2MB的記憶體,因此編譯數千種方法所需要的記憶體,很快就會接近大多數電腦的配備上限。
而為了解決大量方法造成的效能低落,JIT壓縮將會是可行的方法,當編譯方法數量接近1,000個,MJIT將在記憶體中組合這些方法,以縮減他們的大小,這樣將有助於改善現在遭遇的問題,不過,這仍然不足以讓Rails變得夠快。

儘管如此,官方仍然預計將刪除—jit選項,在Ruby 2.7預設啟用MJIT,儘管在這之前Rails使用MJIT的效能,還不太可能提升至與當前相當。


Advertisement

更多 iThome相關內容