2

タスクを完了するのに約 4 分かかる Ruby プログラムがあり、1 分未満に短縮したいと考えています。

gem から ruby​​-prof を試してみましたが、有効にすると実行時間が最大 30 分に増加し、単調性を特にうまく維持しているようには見えません (いくつかの変更により、プロファイラーを使用した場合のパフォーマンスが確実に向上し、プロファイラーを使用しない場合のパフォーマンスが確実に低下します)。このタスクは、独立して意味のあるプロファイリングが可能な部分に分解することもできません。

Rubyコードを最小限のオーバーヘッドでプロファイリングする現在の最良の方法は何ですか?

私は OSX を使用していますが、何らかの理由でプロファイラーが別の OS を必要とする場合は、再起動することがあります。

EDIT:perftools.rbオーバーヘッドははるかに低いですが、結果は正直言ってかなり疑わしいように見えます.合理的なサンプリングエラーの範囲外です.少なくともGCやI/Oバッファリングなどをいじっている必要があり、多くのばかげた誤解を引き起こしています. それでも ruby​​-prof を凌駕します。

誰かがそれ以上のことを知っている場合に備えて、質問を開いたままにします。

4

2 に答える 2

6

MRI や YARV を使用しても、これ以上改善できるとは思いません。

ただし、Rubinius には組み込みのプロファイラー ( で呼び出すだけ-Xprofile) があり、オーバーヘッドははるかに少なくなります。

また、JRuby を使用すると、これまでに作成された最高のプロファイラーを含む Java ツールの配列全体を取得できます。JRuby の特定のサポートがなくても、これらのツールは非常に役立ちます。Oracle JDKには、この非常に優れたVisualVMツールがあり、プログラムに関するあらゆる種類のものを視覚化できます(そして、JRubyプラグインもあることがわかります)。Oracle JRockit には優れたプロファイラもあります。Azul JVM には、驚くほど素晴らしいプロファイラーがあると噂されています。J9にも素晴らしいものがあると思います。もちろん、YourKitもあります。

Charles Oliver Nutter と JRuby コミュニティの他のメンバーは、最近、JRuby を使用した Ruby コードの実行時の動作を理解するための一連の記事を書きました。ほとんどの場合、これらの記事はMRI 用の memprof ライブラリへの反応として書かれたため、メモリ プロファイリングに焦点を当てる傾向がありますが、呼び出しプロファイリングに関するものもあります。

私の知る限り、MacRuby の目標の 1 つは、Ruby で XCode のランタイム理解機能 (Instruments and Co.) を使用できるようにすることでしたが、それはより長期的な目標であり、これが現在実装されているかどうかはわかりません。

Rubinius の例を次に示します。

rbx -Xprofile -e'
  Hash.new {|fibs, n|
    fibs[n] = if n < 2 then n else fibs[n-1] + fibs[n-2] end
  }[100]
'

どちらが印刷されますか:

Total running time: 0.009895000000000001s

  %   cumulative   self                self     total
 time   seconds   seconds      calls  ms/call  ms/call  name
------------------------------------------------------------
   7.59    0.00      0.00        234     0.00     0.01  Hash#find_entry
   5.86    0.00      0.00        419     0.00     0.00  Hash#key_index
   5.49    0.00      0.00        275     0.00     0.00  Hash::Entry#match?
   4.97    0.01      0.00        234     0.00     0.02  Hash#[]

ご覧のとおり、Rubinius プロファイラーの興味深い特性の 1 つは、任意の Ruby コードをプロファイリングでき、Rubinius自体はほとんどが Ruby コードであるため、システム自体に深くプロファイリングできることです。

于 2010-09-28T15:33:35.643 に答える
2

セルフタイムを提供し、機能レベルでレポートを作成し、精度と効率が重要であると考え、コールグラフを提供するプロファイラーは、元のgprofと同じ一連の概念に基づいていますが、わずかな違いがあります。ruby_profは、数多くの例の1つにすぎません。

これが良くない理由です。

これが実際に問題を見つける方法です。これにより、コードをより高速に実行でき、何も購入したりインストールしたりする必要がなくなります。

これは、大幅な高速化を実現するために使用する例です。

于 2010-09-28T17:26:00.633 に答える