簡體   English   中英

禁用Ruby 1.9.x的YARV編譯器

[英]Disabling Ruby 1.9.x's YARV compiler

在使用ruby 1.9.x與1.8.7從命令行運行我的規范之間,應用程序啟動時間有一個非常明顯的差異。 我的應用程序使用ruby 1.8.7的啟動要比使用ruby 1.9.1或1.9.2的啟動快得多。 應用程序啟動時間差約為18秒。 我的應用程序以1.8.7初始化大約需要5秒鍾,而以1.9.1和1.9.2初始化大約需要23秒。

應用程序初始化時間對於生產而言並不重要,但是對於BDD開發而言卻非常重要。 每次更改代碼並運行規格時,每次迭代都必須再等待18秒。

我假定此應用程序初始化時間歸因於我的應用程序初始化時的YARV編譯字節碼。

我是否對YARV減慢了應用程序的初始化速度是否正確,是否有辦法在命令行上禁用YARV。 僅在運行規范時才能夠禁用YARV,這將是非常不錯的選擇。

YARV是一個純Ruby編譯器。 如果禁用它,則什么也沒有了。

更准確地說:YARV是一個多階段實現,其中每個階段都是單模式。 它由Ruby-to-YARV編譯器和YARV解釋器組成。 如果刪除編譯器,那么剩下的唯一就是YARV字節碼解釋器。 除非您要開始使用YARV字節碼編寫應用程序,否則該解釋器對您沒有多大用處。

這與JRuby和IronRuby之類的混合模式實現相反,后者在單個階段中實現了多種執行模式(尤其是編譯器和解釋器)。 如果關閉JRuby或IronRuby中的編譯器,則仍然會留下可用的執行引擎,因為它們都還包含解釋器。 實際上,JRuby實際上是從純解釋器開始的,后來又添加了編譯器,而IronRuby則從純編譯器開始,並且正是由於您遇到的同一問題,他們才添加了解釋 :編譯單元測試只是浪費時間。

目前,Ruby 1.9的唯一解釋實現是JRuby。 當然,您需要處理整個JVM的開銷。 最好的辦法是嘗試快速啟動JRuby(使用每晚從http://CI.JRuby.Org/snapshots/生成的1.6.0.dev版本,因為1.9支持和啟動時間都非常有效馬上就可以)使用一些非常快速啟動的面向桌面的JVM(例如IBM J9)或嘗試JRuby的Nailgun支持,從而使JVM在后台運行。

您還可以嘗試擺脫RubyGems,后者通常會占用很多啟動時間,尤其是在YARV上。 (使用--disable-gem命令行選項可以真正擺脫它。)

當前無法禁用YARV,僅因為MRI 1.9 包含虛擬機,而不包含解釋器。 對於核心團隊而言,維護這兩者將是太多的工作。

將來可能會有緩存YARV生成的字節碼的方法(就像Rubinius一樣)。 目前尚無法通過Ruby加載此類字節碼(請參閱#971 ),但是您可以輕松編寫一個實現該功能的C擴展。

但是,我要說的有18秒的方式太多了,這可能是一個錯誤。 我知道在ruby-core上有一些線程討論了require的緩慢性。 也許您在那找到有趣的東西!

下一個RC 1.9.2可能會更快,因為它沒有預加載$:與所有gem lib目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM