[英]Which is faster: MRI Ruby or JRuby?
如果我使用Ruby on Rails,我應該安裝MRI / YARV Ruby還是JRuby? 哪個更快?
最近的基准測試使JRuby處於領先地位,其次是MagLev,Rubinius,然后是MRI。
基准測試很棘手。 Ruby Benchmark Suite是最常用於Ruby的基准測試。 如果刪除任何實現失敗的基准測試,則會得到以下圖表。
注意我使用了幾何平均值。 這是一個更好的平均性能指標,因為它可以規范異常值和機器規格。
您可以運行的最佳基准將特定於您的應用。 如果你正在尋找整體性能,你可能想要使用真正的線程,所以Rubinius或JRuby是你唯一真正的選擇。
此外,每個實現在不同的事情上都很快。 MRI啟動速度非常快,因此對腳本有好處。 對於運行時間較長的應用程序(如Web應用程序),Rubinius或JRuby通常比MRI更好。
答案取決於許多變量。
但總的來說,Ruby 1.9比JRuby快,但Ruby 1.8比JRuby慢。
例如根據計算機語言基准游戲 :
此外,如果您的應用程序是多線程的, JRuby可能比標准Ruby有一些優勢
(又稱MRI)],取決於您擁有多少核心。
實際上上面的答案不正確,除了mikel的答案,如果你觀察到任何JVM基准測試,你會發現它很慢,所以想象一下JRuby的性能與CRuby相比。
就個人而言,我是MRI Ruby的貢獻者,我認為自從引入MRI Ruby的YARV VM以來,上面的基准圖表並不是真的,這個版本成為最快的,許多基准測試證明了這一點“參見Pat Shaughnessy的基准測試和關於三個着名的Ruby解釋器MRI Ruby,JRuby和Rubinius的評論“。 所以在我看來,由於以下邏輯點,沒有任何比較點: -
1- C比Java快得多,因為它直接在硬件上運行並生成機器代碼。 而JVM生成的Bytecode被認為是中間代碼。
2- JRuby包含一個額外的解釋步驟,不像MRI Ruby“Tokenization,Parsing,AST解析和生成YARV指令”代碼生成“,最后是代碼執行”,而JRuby包含一個額外的階段。
3- MRI中的垃圾收集Ruby比JRuby中的垃圾收集要快得多,甚至當它們在標記和掃描垃圾收集技術中引入一些變化時它們也變得更好。
4-如果你瀏覽大多數使用的公司和技術,他們總是使用MRI Ruby特別是ruby 1.9,我很少看到一家公司使用JRuby,甚至看到很多擴展或貢獻,不像MRI Ruby。
最后Ruby 1.8是的,它更慢,因為它們在AST本身上執行代碼,因此它們用於多次解析AST以執行代碼。
如果我錯了什么,我希望有人糾正我。
使用RVM或從源安裝MRI Ruby dude。 你會發現許多寶石和擴展可以使用
許多用戶已經就基准測試回答了問題。 您的問題專門針對Rails的使用。
我覺得這很不尋常,因為我沒有清楚地看到問題的目標。 有許多使用MRI,許多人使用JRuby和許多其他人。 我會在這方面尋求穩定性,安全性和可維護性,而不是速度。
然而,MRI和JRuby之間存在重要差異。
MRI使用GIL。 這意味着,雖然您可以擁有多個線程,但一次只能有一個線程處於活動狀態。 在不同的Ruby版本中,線程的實現也可能不同。 較新的版本使用操作系統線程(很好的一步),舊版本使用綠色線程。
MRI中沒有真正的並行性。
MRI是多線程的,不是線程安全的,不是並行的。
JRuby是多線程的,而不是線程安全和並行的。
並行性可以改變速度。 兩者都不是線程安全的,所以無論如何你都必須要處理它。 如果你尋找速度並且可以利用並行性,那么我會給JRuby一個明確的答案。
同樣,我不確定在決定MRI和JRuby之間速度是否是最重要的因素。 這是生態系統。 既然你要求速度我就不會再進一步了。
老實說,這取決於你的代碼。 在您的計算機上安裝RVM或Pik,安裝一堆不同版本的ruby,並嘗試在其中運行您的代碼。
例如:經常重啟的應用程序不是JRuby的理想選擇,因為JRuby在Hotspot能夠有效優化代碼之前有一些加速時間。 同樣,依賴於線程的應用程序不是Ruby 1.8.7的理想選擇,因為Ruby 1.8.X不能在處理器上使用多於1個內核,因此無法一次在多個線程上執行。
這些人在programmingzen.com上做了一篇非常棒的文章,比較了很多不同風格的紅寶石。 去年7月發表,所以仍然合理地近期;)那里的頁面比較了這些:
* Ruby 1.8.7 p299
* Ruby 1.9.1 p378
* Ruby 1.9.2 RC2
* IronRuby 1.0 (Mono 2.4.4)
* JRuby 1.5.1 (Java HotSpot(TM) 64-Bit Server VM 1.6.0_20)
* MagLev (rev 23832)
* Ruby Enterprise Edition 2010.02
* Rubinius 1.0.1
可能能夠找到你在那里尋找的東西
http://programmingzen.com/2010/07/19/the-great-ruby-shootout-july-2010/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.