由 naruse 发布于 2018年2月24日
我们很高兴地宣布 Ruby 2.6.0-preview1 的发布。
Ruby 2.6.0-preview1 是迈向 Ruby 2.6.0 的第一个预览版本。 此预览版 1 的发布时间比平时早,因为它包含一个重要的新功能:JIT。
JIT
Ruby 2.6 引入了 JIT(即时)编译器的初始实现。
JIT 编译器的目标是提高任何 Ruby 程序执行的性能。 与其他语言的普通 JIT 编译器不同,Ruby 的 JIT 编译器以一种独特的方式进行 JIT 编译,它将 C 代码打印到磁盘上,并生成通用的 C 编译器进程来生成本机代码。另请参阅:Vladimir Makarov 的 MJIT 组织。
如何使用:只需在命令行中或 $RUBYOPT
环境变量中指定 --jit
。 指定 --jit-verbose=1
可以打印正在进行的 JIT 编译的基本信息。 有关其他选项,请参阅 ruby --help
。
此 JIT 版本的的主要目的是提供一个机会来检查它是否适用于您的平台,并在 2.6 版本发布之前找出安全风险。 目前,只有当 Ruby 由 gcc 或 clang 构建,并且编译器在运行时可用时,才支持 JIT 编译器。 否则,您现在无法使用它。
在 2.6.0-preview1 中,我们只是在为 JIT 准备基础设施,并且只实现了极少的优化。您可以使用此版本在微基准测试中衡量一些潜在的改进,但它尚未准备好用于对 Ruby 的 JIT 编译器的最终性能进行基准测试,尤其是像 Rails 应用程序这样的大型程序。
我们将在 JIT 编译器中实现方法内联,预计这将显著提高 Ruby 的性能。
此外,我们还计划增加支持的平台,下一个计划是支持 Visual Studio。
敬请期待 Ruby 性能的新时代。
新特性
- 添加
Random.bytes
。[特性 #4938] -
添加
Binding#source_location
。[特性 #14230]此方法返回绑定的源位置,一个由
__FILE__
和__LINE__
组成的 2 元素数组。 传统上,相同的信息可以通过eval("[__FILE__, __LINE__]", binding)
获取,但我们计划更改此行为,以便Kernel#eval
忽略binding
的源位置 [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 倍的改进。
自 2.5 以来的其他重要更改
-
$SAFE
是一个进程全局状态,我们可以再次将其设置为0
。[特性 #14250] -
将
safe_level
传递给ERB.new
已被弃用。trim_mode
和eoutvar
参数已更改为关键字参数。[特性 #14256] -
合并了 RubyGems 2.7.6
自 Ruby 2.5.0 以来,通过这些更改,1115 个文件发生了更改,增加了 23023 行代码 (+),删除了 14748 行代码 (-)!
今天,2 月 24 日,是 Ruby 的 25 岁生日。 祝 Ruby 生日快乐,并享受使用 Ruby 2.6.0-preview1 编程的乐趣!
下载
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview1.tar.gz
SIZE: 16082501 bytes SHA1: 94b4a2f5f992dc9855364284e9c64316bf129c90 SHA256: 2023c42676d9237481e1a97157d5e2ecc10db5e320d5b9cf872ec1d293265d61 SHA512: 004696c4f087333ba7cb2285418dcce70f399966ae8fed817aab9759fd2d75beb088c4aeb294fcd4260112e8422f490cd4dbdfce402d73f96bb679b8bb3e1607
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview1.zip
SIZE: 19807007 bytes SHA1: 24d76f67bf913348eca783a2ecf6f3faf37299ae SHA256: 6c883927e80430cf07f2d90728d6c2c71164223f378a48ebf964d3b66319f623 SHA512: 1e7f318cec1b7875fd9891df671078de7585b556695a2a85708483ddcacfd6e0b63b70ec2535e92ff981b4f72063721ed552df49688e066666fcd7ae520ae667
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview1.tar.bz2
SIZE: 14104578 bytes SHA1: 9f0fb79643a4673a839b0c8496eccc6e1dbd022d SHA256: 8bd6c373df6ee009441270a8b4f86413d101b8f88e8051c55ef62abffadce462 SHA512: d9cb270529a97670d54f43a0236fab072714e715c39277dab70b7a1843ec818e6700e47e1384c7256f9e0ae41ab2c0b768a0de38a5ecf4f4fff5da6ef5ad4944
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview1.tar.xz
SIZE: 11423984 bytes SHA1: bbbc89d760cdaadbca3cbff587295864edeff0af SHA256: 1d99139116e4e245ce543edb137b2a8873c26e9f0bde88d8cee6789617cc8d0e SHA512: d12ff29778d8d940344619881b4d8247c2fb6b44ac2b2dbddb7078828e893cfac9a5a95b5588f0afdbed52bdb6dea95cff1b9ce3ad47dfa62209e97dab8810b6