Инструменты профилирования
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или:objectout:задаёт путь к файлу с результатами
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 — локальная установка не требуется.
Все уроки этого курса
- Измерение производительности
- Инструменты профилирования
- Оптимизация памяти
- Распространённые узкие места