60

プログラムの 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!
--------------------------------------------------------------------------------
4

1 に答える 1

68

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 が呼び出すすべてのメソッドです (これはあなたのコードのように見えるので、注意する必要があります)。 (a/b コール列)、およびそれらのコールにかかった時間。実行時間が最も長い順に並べられます。あなたの場合、それは ChatServer クラスの receive_frame メソッドです。
  • 次に、receive_frames に焦点を当てたセクション (2 つ下にあり、receive_frame の「100%」ラインを中心に配置) を見下ろし、そのパフォーマンスがどのように分類されているかを確認できます。各セクションは同じように設定され、通常、最も時間がかかった後続の関数呼び出しが次のセクションの焦点になります。ruby-prof は、完全な呼び出しスタックを通じてこれを続けます。解決したいボトルネックが見つかるまで、好きなだけ深く進むことができます。
于 2011-03-20T03:25:04.043 に答える