web-dev-qa-db-ja.com

Ruby-profの出力を理解する

私は自分のプログラムの1つでRuby-profilerを実行しました。各フィールドの意味を理解しようとしています。すべてがCPU時間(実時間ではない)だと思いますが、これは素晴らしいことです。 「---」の意味を理解したい。そこにある種のスタック情報がありますか。 a/bとはどういう意味ですか?

Thread ID: 81980260
Total Time: 0.28

  %total   %self     total      self      wait     child            calls   Name
--------------------------------------------------------------------------------
                      0.28      0.00      0.00      0.28              5/6     FrameParser#receive_data
 100.00%   0.00%      0.28      0.00      0.00      0.28                6     FrameParser#read_frames
                      0.28      0.00      0.00      0.28              4/4     ChatServerClient#receive_frame
                      0.00      0.00      0.00      0.00             5/47     Fixnum#+
                      0.00      0.00      0.00      0.00              1/2     DebugServer#receive_frame
                      0.00      0.00      0.00      0.00            10/29     String#[]
                      0.00      0.00      0.00      0.00            10/21     <Class::Range>#allocate
                      0.00      0.00      0.00      0.00            10/71     String#index
--------------------------------------------------------------------------------
 100.00%   0.00%      0.28      0.00      0.00      0.28                5     FrameParser#receive_data
                      0.28      0.00      0.00      0.28              5/6     FrameParser#read_frames
                      0.00      0.00      0.00      0.00             5/16     ActiveSupport::CoreExtensions::String::OutputSafety#add_with_safety
--------------------------------------------------------------------------------
                      0.28      0.00      0.00      0.28              4/4     FrameParser#read_frames
 100.00%   0.00%      0.28      0.00      0.00      0.28                4     ChatServerClient#receive_frame
                      0.28      0.00      0.00      0.28              4/6     <Class::Lal>#safe_call
--------------------------------------------------------------------------------
                      0.00      0.00      0.00      0.00              1/6     <Class::Lal>#safe_call
                      0.00      0.00      0.00      0.00              1/6     DebugServer#receive_frame
                      0.28      0.00      0.00      0.28              4/6     ChatServerClient#receive_frame
 100.00%   0.00%      0.28      0.00      0.00      0.28                6     <Class::Lal>#safe_call
                      0.21      0.00      0.00      0.21              2/4     ChatUserFunction#register
                      0.06      0.00      0.00      0.06              2/2     ChatUserFunction#packet
                      0.01      0.00      0.00      0.01            4/130     Class#new
                      0.00      0.00      0.00      0.00              1/1     DebugServer#profile_stop
                      0.00      0.00      0.00      0.00             1/33     String#==
                      0.00      0.00      0.00      0.00              1/6     <Class::Lal>#safe_call
                      0.00      0.00      0.00      0.00              5/5     JSON#parse
                      0.00      0.00      0.00      0.00              5/8     <Class::Log>#log
                      0.00      0.00      0.00      0.00              5/5     String#strip!
--------------------------------------------------------------------------------
58
Prasanna

Ruby-prof出力の各セクションは、特定の関数の検査に分割されます。たとえば、出力の最初のセクションを見てください。 FrameParserのread_framesメソッドが焦点であり、基本的に次のように言っています。

  • プロファイルされた実行時間の100%がFrameParser#read_frames内で費やされました
  • FrameParser#read_framesが6回呼び出されました。
  • read_framesへの6回の呼び出しのうち5回はFrameParser#receive_dataからのものであり、これは実行時間の100%を占めています(これはread_frames行の上の行です)。
  • Read_framesメソッドの下の行(ただし、その最初のセクション内)は、FrameParser#read_framesが呼び出すすべてのメソッドです(これはコードのように見えるため、注意する必要があります)。このメソッドのうち、read_framesが呼び出すメソッドの総数は(a/b呼び出し列)、およびそれらの呼び出しにかかった時間。それらは、実行時間が最も長いものの順に並べられています。あなたの場合、それはChatServerクラスのreceive_frameメソッドです。
  • 次に、receive_framesに焦点を当てたセクション(2つ下にあり、receive_frameの「100%」の線を中心に配置)を見て、パフォーマンスがどのように分類されているかを確認できます。各セクションは同じ方法で設定され、通常、最も時間がかかった後続の関数呼び出しが次のセクションの焦点になります。 Ruby-profは、完全な呼び出しスタックを通じてこれを継続します。解決したいボトルネックが見つかるまで、好きなだけ深く進むことができます。
64
Pete