Experimental feature in GraalVM

回報效能問題

如果您發現 TruffleRuby 的效能比其他 Ruby 實作版本低,我們很樂意聽取您的意見。請在 GitHub 上回報您發現的任何效能問題。

相容性指南列出了一些我們知道速度較慢且不太可能加快速度的功能。

常見問題與原因 #

TruffleRuby 使用非常精密的技術來最佳化您的 Ruby 程式。這些最佳化需要時間來套用,因此 TruffleRuby 通常會比其他實作版本慢很多,直到它有時間暖機。

此外,TruffleRuby 會嘗試找出您程式的「穩定狀態」,然後在不需要的地方自動移除 Ruby 的動態性,但這也表示如果穩定狀態受到干擾,效能會再次降低,直到 TruffleRuby 可以適應新的穩定狀態。

另一個問題是,TruffleRuby 非常擅長移除不必要的工作,例如不需要的計算或不包含任何工作的迴圈。

所有這些問題使得 TruffleRuby 的基準測試變得困難。這不是我們獨有的問題 - 它適用於許多精密的虛擬機器 - 但大多數 Ruby 實作版本尚未執行足夠強大的最佳化來顯示這些問題,因此它們對 Ruby 社群中的某些人來說可能是新的。

使用 Oracle GraalVM #

若要實驗 TruffleRuby 的速度有多快,請使用Oracle GraalVM

使用 JVM 配置 #

為了獲得最佳的峰值效能,請使用 JVM 配置,並使用 --jvm。預設的本機配置啟動速度更快,但無法達到相同的峰值效能。但是,您必須使用良好的基準測試工具(例如下面描述的 benchmark-ips)來執行基準測試,否則較慢的暖機時間將表示您在基準測試中看不到 TruffleRuby 的真實效能。如果您想編寫更簡單的基準測試,而這些基準測試只是使用簡單的計時器執行 while 迴圈(無論如何我們不建議這樣做),則請使用預設的本機模式,以便啟動和暖機時間較短。

如何檢查基本效能問題 #

如果您正在檢查 TruffleRuby 的效能,我們建議您始終使用 --engine.TraceCompilation 旗標執行。如果您看到編譯失敗或重複編譯相同的方法,這表示某些東西無法正常運作,您可能需要檢查原因,或請我們協助您檢查。如果您未使用此旗標執行,TruffleRuby 將嘗試解決錯誤,而您將不會看到問題。

如何編寫效能基準測試 #

TruffleRuby 團隊建議您使用 benchmark-ips 來檢查 TruffleRuby 的效能。如果您使用 benchmark-ips 的報告來回報任何潛在的效能問題,對我們來說會更容易。

基準測試可能如下所示

require 'benchmark/ips'

Benchmark.ips do |x|
  x.iterations = 2

  x.report("adding") do
    14 + 2
  end
end

我們在 benchmark-ips 中使用 x.iterations = 擴充功能來執行 benchmark-ips 的暖機和測量週期兩次,以確保結果穩定並提供足夠的暖機時間(可以使用 x.warmup = 5 調整)。

您應該會看到類似這樣的內容

Warming up --------------------------------------
              adding    20.933k i/100ms
              adding     1.764M i/100ms
Calculating -------------------------------------
              adding      2.037B (±12.7%) i/s -      9.590B in   4.965741s
              adding      2.062B (±11.5%) i/s -     10.123B in   4.989398s

我們要查看最後一行,該行指出 TruffleRuby 每秒執行此區塊 20.62 億次迭代,誤差幅度為 ±11.5%。

將其與像 Rubinius 這樣的實作版本進行比較

Warming up --------------------------------------
              adding    71.697k i/100ms
              adding    74.983k i/100ms
Calculating -------------------------------------
              adding      2.111M (±12.2%) i/s -     10.302M
              adding      2.126M (±10.6%) i/s -     10.452M

在這裡,TruffleRuby 的效能可以描述為比 Rubinius 快一千倍。這似乎很多 - 而這裡實際發生的情況是,TruffleRuby 正在最佳化您的基準測試。對於無法最佳化的複雜程式碼,這種影響較不明顯。

最後的技術注意事項:黑洞和數值分析 #

其他語言的一些基準測試工具具有稱為「黑洞」的功能。這些功能會包圍一個值,使其在執行期看起來像一個變數,即使它實際上是一個常數,這樣最佳化器就不會移除它,並且實際上會執行使用它的任何計算。但是,TruffleRuby 使用廣泛的數值分析(快取值並將它們轉換為常數),因此即使您使一個值在其來源看起來像是一個變數,它也可能在中間階段進行數值分析。一般而言,最好使用自然會擊敗數值分析的更複雜的基準測試,而不是手動新增註解來關閉重要的功能。

與我們聯繫