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 的編程之旅吧!