6

Ruby プロファイリングは初めてですruby-profが、人気のある選択肢のようです。gem をインストールしてプログラムを起動しました。

ruby-prof ./my-prog.rb

ただし、すべての Ruby コア メソッドと標準ライブラリ メソッドのプロファイリング データ、およびその他の gem が含まれているため、出力は非常に詳細です。たとえば、上位 3 行は次のとおりです。

8.79      0.011     0.010     0.000     0.001     3343  *String#% 
7.28      0.078     0.009     0.000     0.069     2068  *Array#each 
4.93      0.038     0.006     0.000     0.032     1098  *Array#map 

私のプログラムが文字列と配列を多く扱っていることはすでに知っているので、それは私にとって少しでも役立つ情報ではありません。コード内のホットスポットだけを気にします

-p graph_htmlや など、他のプリンタ モードをいくつか試しまし-p call_stackたが、すべて同じ問題が発生します。

ruby-profメソッドの削除と簡素化をサポートしていることがわかります。

-x, --exclude regexp             exclude methods by regexp (see method elimination)
-X, --exclude-file file          exclude methods by regexp listed in file (see method elimination)
    --exclude-common-cycles      make common iterators like Integer#times appear inlined
    --exclude-common-callbacks   make common callbacks invocations like Integer#times appear

しかし、私が本当に欲しいものを取得する明白な方法はないようです。これは、私のコードのみのデータをプロファイリングすることです。つまり、Ruby コア/stdlib からのコード内で経過した時間と、他の宝石は私の内部で経過した時間としてのみカウントされます。コード。

foo自分のコードに、何千回も呼び出されてパフォーマンスが低下しているためにパフォーマンスのボトルネックになっているメソッドがあることがわかったら、自分のコードとその中で呼び出されたコア/ライブラリ コードの間の経過時間の内訳を確認したいだけです。その特定の方法。

なぜこれが標準機能ではないのか理解できません。誰もがやりたいことだと思うからです。最初に自分のコードをプロファイリングし、最適化するものがなくなったら、gem の最適化を開始する可能性があります。 Rubyコア/ stdlibを使用することもできます。私は何が欠けていますか?

4

2 に答える 2

2

これは ruby​​-prof の大きな問題であることに同意します。私はperftools.rbを好む傾向がありました。これはgperftoolsと統合され、ホットスポットとそのコール ツリーをすばやく理解するのに優れたグラフィック レポートと共に、さまざまなフォーカス オプションと無視オプションをサポートします。

ruby-prof では、KCacheGrind 形式で出力して、KCacheGrind Viewerを使用して分析することもできます。これには多数の視覚化モードがあり、アドホック フィルタリングと結果の調査が容易になります。

于 2013-08-11T16:38:57.323 に答える
0

テストを介してプロファイリングとベンチマークを行うことができます。Minitest は、テスト フレームワークでこれを許可します。そうすれば、特定の行動に集中してタイミングを計ることができます。

Ruby 2.0 で、または Ruby 1.9 以前の Gem として利用できます。

同じ方法でプロファイリングする限り、require 'profile'同じテストに使用します。

このブログ投稿では、これを行う方法について詳しく説明していますが、大きく変わったとは思いません。

于 2013-08-11T12:51:53.990 に答える