Ruby 2.6.0 正式版已经发布,引入了许多新功能和性能改进,最值得关注的有亮点:git
Ruby 2.6 引入了 JIT (Just-in-time) 编译器实现。github
JIT 编译器旨在提升 Ruby 性能。与其余语言的普通 JIT 编译器不一样,Ruby 的 JIT 编译器以一种独特的方式进行 JIT 编译,它先将 Ruby 编译成 C 代码,而后经过生成通用的 C 编译器过程 (compiler process) 来生成原生机器码。详情可查阅 Vladimir Makarov 的 MJIT 组织。编程
要启用 JIT 编译器,在命令行或 $RUBYOPT 环境变量中指定 --jit 参数便可。c#
在一个名叫 Optcarrot 的 CPU 密集计算基准测试中,Ruby 2.6 与 Ruby 2.5 相比,性能提升了 1.7 倍。不过目前仍然处于试验阶段,详见 Ruby 2.6 JIT - 进程与将来。数组
请保持对 Ruby 新时代性能的关注。ruby
Ruby 2.6 引入了 RubyVM::AbstractSyntaxTree 模块,此模块向后兼容性不作保证。ide
此模块提供一个 parse 方法,传入 Ruby 代码字符串,返回 AST(抽象语法树)节点。而 parse_file 方法则接受一个 Ruby 代码文件做为参数,返回 AST 节点。函数
同时引入了 RubyVM::AbstractSyntaxTree::Node 类,你能够从 Node 对象中获取位置信息和子节点。此功能尚处于实验性质。性能
引入了无限范围 (1..)。这个范围没有终点,如下是使用场景的举例。测试
ary[1..] # 等价于 ary[1..-1] 而不须要魔法 -1 (1..).each {|index| ... } # 从 1 开始无限循环 ary.zip(1..) {|elem, index| ... } # ary.each.with_index(1) { ... }
f = proc{|x| x + 2} g = proc{|x| x * 3} (f << g).call(3) # -> 11; identical to f(g(3)) (f >> g).call(3) # -> 15; identical to g(f(3))
此方法以一个二元组数组 FILE 和 LINE 的形式返回 binding 的源代码路径。传统上,这能够经过执行 eval("[__FILE__, __LINE__]", binding) 来得到相同的数据。但咱们计划改变这一行为让 Kernel#eval 忽略 binding 的源代码路径 [Bug #4352]。因此,用户须要经过新加入的方法来替代以前的 Kernel#eval。
增长 :exception 选项,以让 Kernel.#system 抛出错误而不是返回 false。[Feature #14386]
新增 oneshot 模式 [Feature #15022]
经过与 Ruby 2.5 中引入的提高代码块传递的性能的方法结合,Ruby 2.6 进一步提高了传递代码块调用时的性能。经过 micro-benchmark 测试有 2.6 倍性能提高。[Feature #14045]
瞬态堆是用于管理指向特定类(Array、Hash、Object 和 Struct)短生命周期内存对象的堆。例如,建立小而短生命周期的哈希对象的速度提高到了 2 倍快。根据 rdoc benchmark,咱们观察到了 6% 到 7% 的性能提高。
Fiber.yield 与 Fiber#resume 方法在 64 位 Linux 上提高了 5 倍性能。对于使用 Fiber 密集的程序,约有最高 5% 的性能提高。
更多详情见 NEWS 或 提交日志 以查看详情。
随着这些变更,自 Ruby 2.5.0 已发生了 6437 个文件变动,231471 行新增(+),98498 行删除(-)!
圣诞快乐!享受你 Ruby 2.6 的编程之旅吧!