0

ruby 1.9.xと1.8.7を使用してコマンドラインから仕様を実行する場合、アプリケーションの開始時間に非常に顕著な違いがあります。私のアプリケーションは、ruby1.9.1または1.9.2よりもruby1.8.7の方がはるかに高速に起動します。アプリケーション開始の差は約18秒です。アプリが1.8.7で初期化されるのに約5秒かかり、1.9.1と1.9.2で23秒かかります。

アプリケーションの初期化時間は、本番環境では大きな問題ではありませんが、BDD開発では非常に大きな問題です。コードを変更して仕様を実行するたびに、反復ごとにさらに18秒待つ必要があります。

このアプリケーションの初期化時間は、アプリケーションの初期化時にバイトコードをコンパイルするYARVに起因すると思います。

YARVがアプリケーションの初期化を遅くすることについては正しいですか?コマンドラインでYARVを無効にする方法はありますか?スペックを実行しているときにのみYARVを無効にできると非常に便利です。

4

3 に答える 3

5

YARV は純粋な Ruby コンパイラです。無効にすると、何も残りません。

より正確には、YARV はマルチフェーズの実装であり、各フェーズはシングルモードです。これは、Ruby-to-YARV コンパイラーと YARV インタープリターで構成されています。コンパイラを削除すると、YARV バイトコード インタープリタだけが残ります。YARV バイトコードでアプリを書き始めたくない限り、そのインタープリターはあまり役に立ちません。

これは、JRuby や IronRuby などの複数の実行モード (特に、コンパイラとインタープリターの両方) を 1つのフェーズ内に実装する混合モードの実装とは対照的です。JRuby または IronRuby でコンパイラをオフにしても、どちらにもインタープリターが含まれているため、使用可能な実行エンジンが残ります。実際、JRuby は純粋なインタープリターとして開始し、後でコンパイラーを追加しました。IronRuby は純粋なコンパイラーとして開始し、インタープリターを追加したのは、あなたが見ているのとまったく同じ問題のためです。ユニットテストのコンパイルは単に時間の無駄です。

現在のところ、Ruby 1.9 の唯一の解釈された実装は JRuby です。もちろん、JVM のオーバーヘッド全体を処理する必要があります。最善の方法は、JRuby を起動する速度を試すことです ( 1.9 のサポートと起動時間の両方が非常に重要なため、http: //CI.JRuby.Org/snapshots/からナイトリー 1.6.0.dev ビルドを使用します)。 IBM J9 のような非常に高速に起動するデスクトップ指向の JVM を使用するか、JVM をバックグラウンドで実行し続ける JRuby の Nailgun サポートを試してください。

RubyGems を取り除こうとすることもできます。RubyGems は一般的に、特に YARV でかなりの起動時間を消費します。(--disable-gemコマンドラインオプションを使用して、本当にそれを取り除きます。)

于 2010-07-26T22:05:50.973 に答える
4

MRI 1.9には仮想マシンのみが含まれ、インタープリターは含まれていないため、現在、YARV を無効にする方法はありません。両方を維持することは、コア チームにとって負担が大きすぎるでしょう。

将来的には、YARV が生成するバイトコードをキャッシュする方法がおそらくあるでしょう (Rubinius のように)。現時点では、Ruby を介してそのようなバイトコードをロードする方法はありませんが ( #971を参照)、それを実現する C 拡張機能を簡単に作成できます。

ただし、18 秒は長すぎて、おそらくバグだと思います。の遅さについて議論するいくつかのスレッドが ruby​​-core にあることを私は知っていrequireます。多分あなたはそこに何か面白いものを見つけるでしょう!

于 2010-07-26T22:05:52.560 に答える
0

1.9.2 の次の RC は、すべての gem lib ディレクトリで $: をプリロードしないため、より高速になる可能性があります。

于 2010-08-02T22:43:12.410 に答える