2011-12-18 16 views
1

私はいつも1.9.xがREEよりも速く、より多くのメモリを消費すると考えていました。しかし、最近私が指摘したように、REEは実際にはRSpec仕様を実行するよりも速く、大きなマージンを持っています。RSpecの実行時にREEが1.9.3より速いのはなぜですか?

のみ rspecと空のspecファイル上で実行を含む、空のgemsetとの二倍だ
$ rvm use ree 
$ rvm gemset create sandbox 
$ rvm gemset use sandbox 
$ gem install rspec 

$ time rspec foo_spec.rb 
No examples found. 

Finished in 0.07346 seconds 
0 examples, 0 failures 

real 0m0.104s 
user 0m0.059s 
sys 0m0.015s 

および1.9.3と同じことをやった後、私は

$ time rspec foo_spec.rb 
No examples found. 

Finished in 0.13922 seconds 
0 examples, 0 failures 

real 0m0.208s 
user 0m0.122s 
sys 0m0.022s 

を取得しています。私は、複数の宝石を含む宝石セットにさらに大きな違いがあることを見ています。

なぜこのようなことが起こっているのですか?1.9.3が現在利用可能な最も速いバージョンではないのですか?

OS X LionのRVMを使用してインストールされた最新バージョンを実行しています。

+2

有効なタスクで実際の速度ではなく、起動時間のみを測定しています。役に立つベンチマーク結果を得るために、代わりにコードに合った何か複雑なものを選んでください。 –

+0

また、ファイルシステムのキャッシュに注意してください。より正確な結果を得るには、各テストを20回連続して実行し、最後の15回の実行の中央値を取る。 – phs

+0

@phsはい私はファイルシステムのキャッシュを認識していますが、ファイルを変更したときにしかそれらを再実行しないので、テストが初めて実行されるときに問題が発生します。 –

答えて

5

実際にはベンチに依存します。あなたがそれと同じようなことをするなら、それは私の意見では数えられません。だから、ここに私のBackup宝石の例があります。これはたくさんのファイルを "必要とする"ものとし、実際の世界仕様の束を実行します。

のRuby Enterprise Editionの

time bundle exec rspec spec 

real 0m5.579s 
user 0m3.427s 
sys 0m0.465s 

502 examples, 0 failures 

ルビー1.9.3p0

bundle exec rspec spec 

real 0m3.863s 
user 0m3.552s 
sys 0m0.299s 

502 examples, 0 failures 

特定のパッチがその変更にそれを作ったので、起動時間が1.9.3p0で一般的に高速でありますファイルのアルゴリズムはそれ自身で私は平均Ruby on Railsアプリケーションのサイズに似たアプリの平均ロード時間を約30%減らしたと考える。しかし、最初にロードされたファイルがほとんどなく、プロセスが長く実行されない場合は、処理が遅くなる可能性があります。

1

GCパフォーマンスチューニングの結果は、実際にはREEの恩恵を受けていることがわかります(REEと1.9.3の両方で大規模なRailsアプリケーションで行った実際のベンチマークに基づいています)。

ベンチマークのGCオーバーヘッドをなくすために、実際にリンゴをリンゴと比較しているので、プロセスの中でできるだけ早くリンゴを無効にしてください。あなたは次のようにそれを行うことができます。もちろん

GC.disable

をあなたがGCを起動することなく、すべてのテストを実行するのに十分なメモリを持っている場合、あなただけの有用な結果を得るでしょう。マシンがスワッピングを開始すると、結果は有用ではありません。

+0

GCを有効にする必要があります。スペックを実行する前に実行してください:export RUBY_HEAP_MIN_SLOTS = 600000 && export RUBY_GC_MALLOC_LIMIT = 59000000 && export RUBY_FREE_MIN = 200000 – Michael

関連する問題