自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Ruby 3發(fā)布,為何性能能提升3倍

開發(fā) 后端
對于所有Rubyists來說,2020年是特殊的一年。難道不是這樣么?Ruby 2于2013年發(fā)布,我們使用Ruby 2.x已有7年之久,我們一直在等待Ruby 3的發(fā)布。

對于所有Rubyists來說,2020年是特殊的一年。難道不是這樣么?Ruby 2于2013年發(fā)布,我們使用Ruby 2.x已有7年之久,我們一直在等待Ruby 3的發(fā)布。

終于,等待結(jié)束了。我們終于在圣誕期間迎來了Ruby 3.0.0,它為這種高級通用編程語言提供了更高的性能和其他功能,這不啻給我們最好的圣誕節(jié)禮物?,F(xiàn)在是時候拆開禮品盒了,看看我們得到的所有Ruby 3功能。

 

Ruby 3發(fā)布,為何性能能提升3倍

Ruby 3.0的開發(fā)著眼于更高的性能、并發(fā)性和類型,并成功實現(xiàn)了比Ruby 2.0的性能快3.0倍的目標(biāo)。3.0倍速是在使用新的Ruby 3.0的Just-In-Time(JIT)運行時編譯器時實現(xiàn)的,但與Ruby 2相比,就其VM實現(xiàn)而言,仍然是相當(dāng)可觀的提速。

也許有人會問,為什么把Ruby 3.0的性能提速跟Ruby 2.0對比,而不是諸如Ruby 2.7?請去官網(wǎng)閱讀發(fā)行說明,將性能提高3倍是2015年的既定目標(biāo)。

Ruby3.0的JIT表現(xiàn)出非常出色的性能,非常適合需要多次調(diào)用幾種方法的工作負載。Ruby 3.1有望為需要更多調(diào)用方法的工作負載提高JIT性能。

Ruby 3.0還為并行執(zhí)行功能提供了實驗性的"Ractor",而無需考慮線程安全性;Fiber Scheduler允許攔截阻塞操作、改進靜態(tài)分析、改進的單行模式匹配以及許多其他更改。

Ruby 3主要更新

數(shù)字3在Ruby 3版本中非常有意義。它是發(fā)布版本號,使性能提高了3倍,核心貢獻者(Matz,TenderLove和Koichi)也是三人組。同樣,Ruby 3有3個主要目標(biāo):更快、并發(fā)性更好并確保正確性。

 

Ruby 3發(fā)布,為何性能能提升3倍

1. Ruby 3性能

性能是Ruby 3的主要關(guān)注重點之一。實際上,圍繞Ruby 3,開發(fā)者團隊內(nèi)部最初就進行了討論。Ruby創(chuàng)始人Matz(松本行弘)于2015年設(shè)定了一個雄心勃勃的目標(biāo),就是將Ruby的速度提高3倍。

什么是Ruby 3x3?

在討論這一點之前,讓我們重新審視Ruby的核心理念。

Matz說到:"我希望看到Ruby幫助世界上的每個程序員提高生產(chǎn)力,享受編程并感到幸福。"

關(guān)于Ruby 3x3,有人問是否目標(biāo)是使Ruby成為最快的語言?答案是不。Ruby 3x3的主要目標(biāo)是使Ruby的速度比Ruby 2快3倍。

Matz談到:"沒有一種語言足夠快。"

Ruby并非為追求速度最快而設(shè)計,如果這是目標(biāo),那么Ruby將不會是今天這種局面。隨著Ruby語言性能的提高,它無疑有助于我們的應(yīng)用程序更快且可擴展。

Matz坦承:"在Ruby語言的設(shè)計中,我們主要集中在生產(chǎn)力和編程樂趣上。結(jié)果,Ruby太慢了。"

可以衡量性能的區(qū)域有兩個:內(nèi)存和CPU。

CPU優(yōu)化

Ruby中已進行了一些增強,以提高速度。Ruby團隊從以前的版本中優(yōu)化了JIT(Just In Time)編譯器。Ruby MJIT編譯器最早是在Ruby 2.6中引入的。Ruby 3 MJIT具有更好的安全性,并且似乎在很大程度上提高了Web應(yīng)用程序的性能。

MJIT的實現(xiàn)不同于通常的JIT。當(dāng)方法被反復(fù)調(diào)用(例如10000次)時,MJIT將選擇可以編譯為本機代碼的方法并將其放入隊列。稍后MJIT將獲取隊列并將其轉(zhuǎn)換為本地代碼。

內(nèi)存優(yōu)化

Ruby 3帶有增強的垃圾收集器。它具有類似python的緩沖區(qū)的API,有助于更好地利用內(nèi)存。從Ruby 1.8開始,Ruby在垃圾回收算法方面不斷進步。

 

[[360513]]

自動垃圾壓縮

垃圾收集的最新變化是垃圾壓縮。它是在Ruby 2.7中引入的,該過程有點手動。但是在版本3中,它是全自動的,適當(dāng)調(diào)用壓縮程序以確保適當(dāng)?shù)膬?nèi)存利用率。

對象分組

垃圾壓縮器移動堆中的對象。它將分散的對象組合在一起放在內(nèi)存中的某個位置,以便后面更大的對象可以有效利用內(nèi)存。

2. Ruby 3中的并行性和并發(fā)性

并發(fā)是任何編程語言的重要關(guān)注點之一。Matz認為Ruby程序員未能正確地使用線程這一抽象層。

Matz表示:"我很遺憾添加線程。"

Ruby 3使應(yīng)用程序并發(fā)運行變得容易得多。Ruby 3中增加了一些與并發(fā)相關(guān)的功能和改進。

Fibers

在Ruby 3中,F(xiàn)ibers的引進被認為是突破性的。Fibers是輕量級工作線程,看起來像線程,但具有一些優(yōu)勢。它比線程消耗更少的內(nèi)存。它為程序員提供了更大的控制權(quán),使其可以定義可以暫?;蚧謴?fù)的代碼段,從而實現(xiàn)更好的I/O處理。

Fiber Scheduler

Fiber Scheduler是Ruby 3中添加的一項實驗性功能。它被引入來攔截諸如I/O之類的阻塞操作??上驳氖?,它允許輕量級并發(fā),并且可以輕松集成到現(xiàn)有代碼庫中,而無需更改原始代碼邏輯。這是一個接口,可以通過諸如EventMachine或Async之類的gem創(chuàng)建包裝器來引入,此接口設(shè)計允許事件循環(huán)實現(xiàn)與應(yīng)用程序代碼之間的關(guān)注點分離。

以下是HTTP使用并發(fā)發(fā)送多個請求的示例Async。

 

  1. require 'async'  
  2. require 'net/http'  
  3. require 'uri'  
  4. LINKS = [  
  5. 'https://xmyy.com' 
  6. 'https://www.xmyy.com'  
  7.  
  8. Async do  
  9. LINKS.each do |link|  
  10. Async do  
  11. Net::HTTP.get(URI(link))  
  12. end  
  13. end  
  14. end 

Ractors(Guilds)

眾所周知,Ruby的globalVM lock(GVL)阻止大多數(shù)Ruby線程并行計算。Ractor可以解決此問題,GVL可以提供更好的并行性。Ractor是類似于Actor-Model的并發(fā)抽象,旨在提供并行執(zhí)行而無需擔(dān)心線程安全。

Ractors允許不同Ractor中的線程同時計算。每個Ractor具有至少一個線程,該線程可以包含多個Fibers。在Ractor中,在給定的時間只允許執(zhí)行一個線程。

以下程序返回一個非常大的平方根。它并行計算兩個數(shù)字的結(jié)果。

 

  1. # Math.sqrt(number) in ractor1, ractor2 run in parallel  
  2. ractor1, ractor2 = *(1..2).map do  
  3. Ractor.new do  
  4. number = Ractor.recv  
  5. Math.sqrt(number)  
  6. end  
  7. end  
  8.  
  9. # send parameters  
  10. ractor1.send 3**71  
  11. ractor2.send 4**51  
  12.  
  13. p ractor1.take #=> 8.665717809264115e+16  
  14. p ractor2.take #=> 2.251799813685248e+15 

3.靜態(tài)分析

我們需要測試以確保我們程序的正確性。但是,從本質(zhì)上講,測試可能意味著重復(fù)的代碼工作。

Matz甚至吐槽:"我討厭測試,因為它不是人干的。"

為了確保程序的正確性,除了測試之外,靜態(tài)分析是個不錯的工具。

靜態(tài)分析依賴于內(nèi)聯(lián)類型注釋。解決此難題的解決方案是使.rbs文件與我們的.rb文件平行。

RBS

RBS是一種描述Ruby程序結(jié)構(gòu)的語言。它為我們提供了該程序的概述,以及如何定義整體類,方法等。使用RBS,我們可以編寫Ruby類、模塊、方法、實例變量、變量類型和繼承的定義。它支持Ruby代碼中的常用模式以及高級類型(如并集和鴨子duck typing類型)。

這些.rbs文件類似于.d.tsTypeScript中的文件。以下是一個.rbs文件外觀的小例子。具有類型定義的優(yōu)點是可以針對實現(xiàn)和執(zhí)行進行驗證。

下面的示例是不言自明的。我們需要在這里注意的一件事是each_post接受一個塊或返回一個枚舉器。

 

  1. user.rbs  
  2. class User  
  3. attr_reader name: String  
  4. attr_reader email: String  
  5. attr_reader age: Integer  
  6. attr_reader posts: Array[Post]  
  7. def initialize: (name: String,  
  8. email: String,  
  9. age: Integer) -> void  
  10. def each_post: () { (Post) -> void } -> void  
  11. | () -> Enumerator[Post, void]  
  12. end 

其他值得注意的變化

  • 粘貼到IRB中的速度要快得多。
  • 回溯的順序已顛倒。首先打印錯誤消息和行號,然后打印其余的跟蹤信息。
  • Hash#transform_keys 接受將舊密鑰與新密鑰映射的哈希。
  • 插值字符串文字在# frozen-string-literal: true使用時不再凍結(jié)。
  • Symbol#to_proc現(xiàn)在返回一個lambda Proc。
  • 添加了Symbol#name ,它以凍結(jié)的字符串形式返回符號的名稱。

過渡

為了滿足Ruby 3的目標(biāo)需求,許多核心庫已經(jīng)作了修改。但這并不意味著我們的舊應(yīng)用程序會突然停止工作。Ruby團隊已確保這些更改向后兼容。我們可能會在現(xiàn)有代碼中看到一些棄用警告。開發(fā)人員可以修復(fù)這些警告,以從舊版本平穩(wěn)過渡到新版本。我們都準(zhǔn)備使用新功能并希冀從新的性能改進中受益。

結(jié)論

隨著性能、內(nèi)存利用率、靜態(tài)分析以及Ractors和Scheduler等新功能的極大改進,我們對Ruby的未來充滿信心。使用Ruby 3,應(yīng)用程序可以具有更大的可伸縮性和更令人愉快的使用。即將到來的2021年不僅是所有Rubyists的新年,而且是一個新時代。

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2019-06-25 10:11:01

cpu計算機測評

2012-05-07 23:19:00

RhinoJavaJVM編程語言

2012-02-16 09:15:48

JavaJActor

2012-03-15 09:21:25

ExpresionJJava

2009-06-19 10:45:05

NetBeans 6.

2009-06-23 21:03:55

Linux

2010-06-08 08:53:16

opensuse 11

2010-04-26 09:06:03

JavaFX 1.3

2011-01-06 09:57:31

Linux Kerne

2011-03-03 09:42:05

Ubuntu 11.0

2012-03-30 14:31:53

HibernateJava

2013-02-26 09:36:57

RubyRuby 2.0

2015-11-16 11:31:35

Kubernetes網(wǎng)絡(luò)性能新版本特性

2012-02-29 10:54:21

JavaPlay Framew

2011-07-07 10:33:27

Ruby

2011-10-10 09:56:43

Ruby

2009-07-21 12:49:10

Ruby on RaiRoR

2011-12-21 11:13:22

JavaScript

2011-03-07 09:22:51

2012-05-23 10:22:36

JBossJava
點贊
收藏

51CTO技術(shù)棧公眾號