Ruby 3.0.0发布:Ruby3将比Ruby2快3倍


从2015年开始,我们朝着Ruby 3进行了艰苦的开发,其目标是性能、并发性和类型三方面提升。Matz特别提到性能,“ Ruby3将比Ruby2快3倍”,也就是Ruby 3x3



借助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