0Pricing
Ruby Academy · Урок

Инструменты профилирования

ruby-prof и stackprof

«Инструменты профилирования» — бесплатный урок Ruby Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.

Тест производительности и профилировщик

Тест производительности показывает, сколько времени занимает операция. Профилировщик показывает, куда уходит время внутри неё.

  • Профилировщики распределяют время по методам или строкам
  • Они выявляют узкие места, которые невозможно обнаружить догадкой
  • Популярные профилировщики Ruby: ruby-prof и stackprof
# Profilers answer: which method consumed the most time?
puts 'Benchmark = how long, Profiler = where'

Обзор ruby-prof

ruby-prof — подробный профилировщик с инструментированием. Он перехватывает каждый вызов метода.

  • Очень точно подсчитывает вызовы и измеряет время
  • Создаёт большие накладные расходы, поэтому используйте его на репрезентативных выборках
  • Устанавливается с помощью gem install ruby-prof
# Gemfile
gem 'ruby-prof'

Профилирование блока с ruby-prof

Оберните код в RubyProf.profile, чтобы получить результат, который можно вывести.

  • Возвращает объект с результатами профилирования
  • Передайте его средству вывода
require 'ruby-prof'

result = RubyProf.profile do
  1000.times { |i| (1..i).reduce(:+) }
end

RubyProf::FlatPrinter.new(result).print(STDOUT)

Форматы вывода ruby-prof

ruby-prof предлагает несколько форматов вывода для разных представлений данных.

  • FlatPrinter — отсортированный список методов
  • GraphPrinter — связи между вызывающими и вызываемыми методами
  • CallTreePrinter — вывод для KCachegrind
require 'ruby-prof'

result = RubyProf.profile { 100.times { 'x' * 1000 } }
RubyProf::GraphPrinter.new(result).print(STDOUT, min_percent: 1)

Чтение плоского профиля

Плоский профиль перечисляет методы по затраченному времени.

  • %self — время, затраченное самим методом
  • общее — время с учётом вызываемых методов
  • вызовы — количество обращений к методу

Сначала сосредоточьтесь на записях с наибольшим значением %self.

# Example flat output columns:
# %self  total  self  wait  child  calls  name
puts 'Optimize the top %self method first'

Обзор stackprof

stackprof — профилировщик на основе выборки. Он периодически записывает стек вызовов.

  • Очень малые накладные расходы, поэтому его безопасно использовать в рабочей среде
  • Выполняет выборку по CPU, времени по часам или выделению объектов
  • Устанавливается с помощью gem install stackprof
# Gemfile
gem 'stackprof'

Запуск stackprof

StackProf.run профилирует блок и записывает результаты в файл.

  • mode: может принимать значение :cpu, :wall или :object
  • out: задаёт путь к файлу с результатами
require 'stackprof'

StackProf.run(mode: :cpu, out: 'profile.dump') do
  1_000_000.times { |i| Math.sqrt(i) }
end

Изучение результатов stackprof

Используйте инструмент командной строки stackprof, чтобы прочитать файл с результатами.

  • stackprof profile.dump --text выводит сводку
  • --method Name#meth позволяет подробно изучить один метод
  • --flamegraph создаёт данные для пламенной диаграммы
# Shell
# stackprof profile.dump --text
# stackprof profile.dump --method 'Array#sort'
puts 'Analyze the dump with the stackprof CLI'

Выборка и инструментирование

Эти два профилировщика обменивают точность на накладные расходы.

  • ruby-prof инструментирует каждый вызов: результат точный, но работа медленнее
  • stackprof выполняет выборку: результат приблизительный, зато затраты малы
  • Используйте stackprof в рабочей среде, а ruby-prof — для детального анализа
modes = { 'ruby-prof' => 'instrumenting', 'stackprof' => 'sampling' }
modes.each { |tool, kind| puts "#{tool}: #{kind}" }

Время по часам и время CPU

Выбирайте режим профилирования в зависимости от узкого места.

  • Режим CPU показывает вычислительно нагруженный код
  • Режим времени по часам также учитывает ожидание ввода-вывода, например сети или диска
  • Для медленных конечных точек с вызовами базы данных нужен режим времени по часам
# I/O bound? use wall. CPU bound? use cpu.
bottleneck = 'database query'
mode = bottleneck.include?('query') ? :wall : :cpu
puts "Use mode: #{mode}"

Процесс профилирования

Эффективное профилирование выполняется по циклу.

  • Воспроизведите медленный сценарий
  • Проведите профилирование, чтобы найти узкое место
  • Оптимизируйте только это узкое место
  • Повторите профилирование, чтобы подтвердить улучшение
steps = ['reproduce', 'profile', 'optimize hotspot', 're-profile']
steps.each_with_index { |s, i| puts "#{i + 1}. #{s}" }

Проверка

Проверьте свои знания о профилировании.

Повторение

Вы изучили инструменты профилирования:

  • Профилировщики показывают, где расходуется время, а не только сколько его требуется
  • ruby-prof инструментирует каждый вызов для получения подробных точных данных
  • stackprof выполняет выборку с малыми затратами и безопасен для рабочей среды
  • Выбирайте режим CPU или времени по часам в зависимости от узкого места
  • Следуйте циклу: воспроизвести, профилировать, оптимизировать, повторно профилировать

Далее вы уменьшите количество выделений памяти.

Часто задаваемые вопросы

Урок «Инструменты профилирования» бесплатный?

Да — полный текст урока «Инструменты профилирования» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.

Чему я научусь в уроке «Инструменты профилирования»?

ruby-prof и stackprof Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Ruby Academy?

Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Инструменты профилирования»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Ruby Academy?

Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Измерение производительности
  2. Инструменты профилирования
  3. Оптимизация памяти
  4. Распространённые узкие места
← Назад к Ruby Academy