Ruby 3.0.0釋出:Ruby3將比Ruby2快3倍

banq發表於2020-12-25

從2015年開始,我們朝著Ruby 3進行了艱苦的開發,其目標是效能、併發性和型別三方面提升。Matz特別提到效能,“ Ruby3將比Ruby2快3倍”,也就是Ruby 3x3


Ruby 3.0.0釋出:Ruby3將比Ruby2快3倍
藉助Optcarrot基準測試,該基準基於NES的遊戲模擬工作負載來測量單執行緒效能,其效能比Ruby 2.0快3倍!
 
Ruby 3.0.0涵蓋了這些目標

  • 效能
    • MJIT
  • 併發
    • Reactor
    • 光纖Fiber排程器
  • 型別(靜態分析)
    • RBS
    • TypeProf

透過上述效能改進,Ruby 3.0引入了以下許多新功能。
 
從Ruby 3.0開始,JIT可以在有限的工作負載中提高效能。儘管Ruby 3.0大大減小了JIT版本的程式碼的大小,但它仍未準備好最佳化諸如Rails之類的工作負載,請繼續關注Ruby 3.1以進一步解決此問題。
 
今天是多核時代。併發非常重要。有了Ractor,再加上Async Fiber,Ruby將成為真正的併發語言。— Matz
Ractor是類似於併發抽象的Actor模型,旨在提供並行執行功能而無需擔心執行緒安全。
您可以製造多個Actor,也可以並行執行它們。Ractor使您可以製作執行緒安全的並行程式,因為ractors無法共享普通物件。Actor之間的交流是透過交流資訊來支援的。

def tarai(x, y, z) =
  x <= y ? y : tarai(tarai(x-1, y, z),
                     tarai(y-1, z, x),
                     tarai(z-1, x, y))
require 'benchmark'
Benchmark.bm do |x|
  # sequential version
  x.report('seq'){ 4.times{ tarai(14, 7, 0) } }

  # parallel version
  x.report('par'){
    4.times.map do
      Ractor.new { tarai(14, 7, 0) }
    end.each(&:take)
  }
end


Benchmark result:
   user     system      total        real
seq  64.560736   0.001101  64.561837 ( 64.562194)
par  66.422010   0.015999  66.438009 ( 16.685797)


在Ubuntu 20.04,Intel(R)CoreTM i7-6700(4核,8個硬體執行緒)上測量了結果。它表明並行版本比順序版本快3.87倍。
 
Fiber#scheduler引入用於攔截阻塞操作。這允許輕量級的併發,而無需更改現有程式碼。下面示例程式將同時執行幾個HTTP請求:

require 'async'
require 'net/http'
require 'uri'

Async do
  ["ruby", "rails", "async"].each do |topic|
    Async do
      Net::HTTP.get(URI "https://www.google.com/search?q=#{topic}")
    end
  end
end


它使用提供事件迴圈的非同步。此事件迴圈使用Fiberscheduler掛鉤進行Net::HTTP非阻塞。其他gem可以使用此介面為Ruby提供非阻塞執行,並且這些gem可以與支援相同非阻塞鉤子的Ruby其他實現(例如JRuby,TruffleRuby)相容。
 
2010年代是靜態型別程式語言的時代。Ruby透過使用抽象解釋的無型別宣告的靜態型別檢查來尋求未來。RBS和TypeProf是未來的第一步。更多步驟。— Matz
 

相關文章