经5年开发,性能是前主要版本3倍的Ruby 3正式登场

从2015年就开始着手开发的Ruby 3,总算赶在2020年末,当作圣诞礼物送给所有开发者。Ruby 3的更新重点放在3个地方,性能、并行性和类型。

特别是性能,在Ruby 3有了大幅度的增长,Ruby的主要设计人松本行弘(Matz)在之前就为核心开发团队设立目标,希望Ruby 3的速度可以是Ruby 2的3倍,并将这个计划称为Ruby3x3,而现在Ruby 3完成了这个目标。

开发团队以Optcarrot基准测试来比较Ruby 2.0、Ruby 3.0以及Ruby 3.0 JIT的速度,Ruby 3.0 JIT在NES游戏模拟工作负载的单线程性能,是Ruby 2.0的3倍。核心团队对MJIT(Method-based JIT)进行了诸多更新,使得在Ruby 3.0,JIT可以提升游戏、人工智能或是调用少量方法的工作负载性能。

不过,MJIT会让Rails应用程序变慢的问题仍然没有解决。虽然Ruby 3.0已经大幅度减少JIT版本的程序代码大小,但是仍然未对Rails等,需要大量调用方法的工作负载进行优化,JIT会加重这类工作负载指令缓存(i-cache)丢失的情况。官方曾在2年前发布Ruby 2.6时,提到这个问题,但是经过了这段时间,仍未找到良好的解决办法,官方要开发者期待Ruby 3.1,他们会持续改进这个问题。

为了跟上多核心计算机发展的脚步,Ruby 3.0也开始提供并行(Concurrent)计算的能力,这个版本加入实验性功能Ractor,提供类似并行计算演员模型(Actor Model)的实例,并让开发者毋须担心线程安全的问题。演员模型把程序执行比喻为演员,演员是并行运算的基本单元,每个演员接受到一则消息,就可以做出一些决策,甚至创建更多的演员,发送更多的消息,并决定回应的消息。

开发者可以在Ruby 3.0中,创建多个Ractor,并且平行执行这些Ractor,由于Ractor之间无法共享一般对象,只能通过交换消息来沟通,因此得以让开发者创建出线程安全的平行程序。经过官方的测量,平行版本的Ruby程序,速度是顺序程序的3.87倍,但官方提到,Ractor尚未成熟,目前仍然被标记为实验性功能,将来可能还会更改。Ruby 3.0还加入了Fiber Scheduler,执行轻量级的平行运算,让应用程序不需要更改现有程序代码,就能获得加速。

Ruby 3.0还加入RBS以及类型分析工具TypeProf,来提供静态分析功能。RBS是一种用来描述Ruby程序类型的语言,其目的是要来支持常见的Ruby程序模式,让开发者可以编写联合类型、方法重载和泛型等高端类型。而TypeProf则是捆绑在Ruby组件中的类型分析工具,目前TypeProf用作类型推断,可读取无类别注释的Ruby程序代码,并且分析方法定义,以及使用方式,以产生RBS格式的类型特征(Type Signature)雏形。目前TypeProf也还在实验阶段,仅支持部分Ruby语言,在侦测类型错误功能仍有限。