由 naruse 发布于 2018年11月6日
我们很高兴地宣布 Ruby 2.6.0-preview3 的发布。
Ruby 2.6.0-preview3 是 Ruby 2.6.0 的第三个预览版本。此 preview3 的发布是为了在发布候选版本之前测试新功能。
JIT
Ruby 2.6 引入了 JIT(即时)编译器的初始实现。
JIT 编译器旨在提高任何 Ruby 程序执行的性能。与其他语言的普通 JIT 编译器不同,Ruby 的 JIT 编译器以一种独特的方式进行 JIT 编译,它将 C 代码打印到磁盘上,并生成通用的 C 编译器进程以生成本机代码。另请参阅:Vladimir Makarov 的 MJIT 组织。
如何使用:只需在命令行中指定 --jit
或 $RUBYOPT
环境变量。指定 --jit-verbose=1
可以打印正在进行的 JIT 编译的基本信息。有关其他选项,请参阅 ruby --help
。
此 JIT 发布的的主要目的是提供一个机会来检查它是否适用于您的平台,并在 2.6 发布之前找出安全风险。当 Ruby 由 GCC、Clang 或 Microsoft VC++ 构建时,支持 JIT 编译器,它们需要在运行时可用。否则,您暂时无法使用它。
截至 Ruby 2.6.0 preview3,我们在名为 Optcarrot 的 CPU 密集型非平凡基准工作负载上实现了比 Ruby 2.5 快 1.7 倍的性能 https://gist.github.com/k0kubun/d7f54d96f8e501bbbc78b927640f4208。我们也将改进 Rails 应用程序等内存密集型工作负载的性能。
请继续关注 Ruby 性能的新时代。
RubyVM::AST [实验性]
Ruby 2.6 引入了 RubyVM::AST
模块。
此模块具有 parse
方法,该方法解析给定的 ruby 代码字符串并返回 AST(抽象语法树)节点,以及 parse_file
方法,该方法解析给定的 ruby 代码文件并返回 AST 节点。还引入了 RubyVM::AST::Node
类。您可以从 Node
对象获取位置信息和子节点。此功能是实验性的。不保证 AST 节点结构的兼容性。
新功能
-
为
Kernel#yield_self
添加了一个新别名then
。[特性 #14594] -
没有
rescue
的else
现在会导致语法错误。[实验性] -
常量名称可以以非 ASCII 大写字母开头。[特性 #13770]
-
无限范围 [特性 #12912]
引入了一个无限范围
(1..)
。它的工作方式是无止境。这显示了典型用例ary[1..] # identical to ary[1..-1] without magical -1 (1..).each {|index| ... } # infinite loop from index 1 ary.zip(1..) {|elem, index| ... } # ary.each.with_index(1) { ... }
-
添加
Binding#source_location
。[特性 #14230]此方法返回绑定的源位置,这是一个由
__FILE__
和__LINE__
组成的 2 元素数组。传统上,相同的信息可以通过eval("[__FILE__, __LINE__]", binding)
来检索,但我们计划更改此行为,以便Kernel#eval
忽略绑定的源位置 [Bug #4352]。因此,用户应该使用这个新引入的方法来代替Kernel#eval
。 -
添加
:exception
选项,让Kernel.#system
引发错误而不是返回false
。[特性 #14386]
性能改进
-
加速
Proc#call
,因为我们不再需要关心$SAFE
。[特性 #14318]通过多次使用
Proc#call
的lc_fizzbuzz
基准测试,我们可以测量到 1.4 倍的改进 [Bug #10212]。 -
加速
block.call
,其中block
是传递的块参数。[特性 #14330]Ruby 2.5 提高了块传递性能。[特性 #14045] 此外,Ruby 2.6 提高了传递块调用的性能。通过微基准测试,我们可以观察到 2.6 倍的改进。
-
引入了瞬态堆 (theap)。[Bug #14858] [特性 #14989] theap 是为由特定类(Array、Hash、Object 和 Struct)指向的短期内存对象管理的堆。例如,创建小型且短期的 Hash 对象的速度快 2 倍。通过 rdoc 基准测试,我们观察到 6-7% 的性能改进。
自 2.5 以来的其他显著变化
-
$SAFE
是一个进程全局状态,我们可以再次将其设置为0
。[特性 #14250] -
将
safe_level
传递给ERB.new
已被弃用。trim_mode
和eoutvar
参数已更改为关键字参数。[特性 #14256] -
合并 RubyGems 3.0.0.beta2。
--ri
和--rdoc
选项已被删除。请使用--document
和--no-document
选项代替它们。 -
合并 Bundler 作为默认 gem。
自 Ruby 2.5.0 以来,进行了这些更改,更改了 6474 个文件,插入了 171888 行 (+),删除了 46617 行 (-)!
享受使用 Ruby 2.6.0-preview3 编程的乐趣!
下载
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview3.tar.gz
SIZE: 17071670 bytes SHA1: 67836fda11fa91e0b988a6cc07989fbceda025b4 SHA256: 60243e3bd9661e37675009ab66ba63beacf5dec748885b9b93916909f965f27a SHA512: 877278cd6e9b947f5bb6ed78136efb232dcc9c5c218b7236576171e7c3cd7f6b7d10d07d8402014a14aba1fcd1913a4370f0725c561ead41d8a3fe92029f7f76
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview3.zip
SIZE: 21537655 bytes SHA1: 45f3c90dfffe03b746f21f24152666e361cbb41a SHA256: 9152af9e700349dcfa2eec196dd91587d42d70a6837fa2c415ebba1167587be1 SHA512: 335de36cf56706326f4acc4bbd35be01e0ac5fff30d0a69b2e1630ba4c78f0e711822d1623d0099a517c824b154917d2f60be192dfb143a422cf1d17b38e1183
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview3.tar.bz2
SIZE: 14973451 bytes SHA1: 5f2df5d8c5a3888ccb915d36a3532ba32cda8791 SHA256: 1f09a2ac1ab26721923cbf4b9302a66d36bb302dc45e72112b41d6fccc5b5931 SHA512: d1693625723796e8902f3e4c4fae444f2912af9173489f7cf18c99db2a217afc971b082fce7089e39f8edd54d762d2b4e72843c8306ed29b05ccb15ac03dbb5b
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview3.tar.xz
SIZE: 12291692 bytes SHA1: 7f8216247745215e9645568e7a02140f9a029b31 SHA256: 9856d9e0e32df9e5cdf01928eec363d037f1a76dab2abbf828170647beaf64fe SHA512: b4d3b17ecf96272c43cd7518c0b54dee63fc1150ad143e1d9c9d708506fe78676c80eb96cc47b8d46d1128bd483a53f16c944963a03d1f99f00131b74714df7b