了解ruby-prof输出

我在我的一个程序中运行了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调用的所有方法(您应该知道,因为这看起来像是您的代码),那么多less个方法总共调用read_frames负责(a / b呼叫列),以及这些呼叫占用了多less时间。 他们是由哪个人执行时间最多的命令。 在你的情况下,这是ChatServer类的receive_frame方法。
  • 然后,您可以看看侧重于receive_frames的部分(2下来,以receive_frame上'100%'为中心),看看它的性能如何被破坏。 每个部分的设置方式相同,通常后续function调用占用最多时间是下一个部分的重点。 ruby教授将继续通过完整的调用堆栈来做到这一点。 你可以深入你想要的,直到你find你想要解决的瓶颈。