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を使用することもできます。私は何が欠けていますか?