怎么里加ruby-prof输出?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (13)

我在我的一个程序中运行了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!
--------------------------------------------------------------------------------
提问于
用户回答回答于

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将继续通过完整的调用堆栈来执行此操作。你可以尽可能深入地找到你想要解决的瓶颈问题。

扫码关注云+社区