Подтвердить что ты не робот

Понимание выхода ruby-prof

Я запускал ruby-profiler в одной из моих программ. Я пытаюсь понять, что означают все поля. Я предполагаю, что все время процессора (а не время настенных часов), что является фантастическим. Я хочу понять, что означает "---". Есть ли какая-то информация о стеке. Что означают вызовы 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!
--------------------------------------------------------------------------------
4b9b3361

Ответ 1

Каждая секция вывода ruby-prof разбивается на рассмотрение определенной функции. например, посмотрите на первый раздел вашего вывода. Метод read_frames в FrameParser является фокусом, и в основном он говорит следующее:

  • 100% времени выполнения, которое было профилировано, было потрачено внутри FrameParser # read_frames
  • FrameParser # read_frames был вызван 6 раз.
  • 5 из 6 вызовов read_frames поступают из FrameParser # receive_data, и это составляет 100% времени выполнения (это строка над линией read_frames).
  • Строки ниже метода read_frames (но внутри этого первого раздела) - это все методы, которые обращаются к FrameParser # read_frames (вы должны знать об этом, так как это похоже на ваш код), сколько из этих методов вызывает общее количество вызовов read_frames отвечает (столбец a/b calls) и сколько времени потребовалось для этих вызовов. Они заказываются, какие из них занимают наибольшее время исполнения. В вашем случае это метод receive_frame в классе ChatServer.
  • Затем вы можете посмотреть в разделе, посвященном параметрам receive_frames (2 вниз и центрироваться по линии "100%" на методе receive_frame) и посмотреть, как его производительность разбита. каждый раздел настраивается таким же образом, и обычно последующий вызов функции, который занимает больше всего времени, находится в центре внимания следующего раздела. ruby-prof продолжит делать это через полный стек вызовов. Вы можете идти так глубоко, как хотите, пока не найдете узкое место, которое хотите решить.