0Pricing
Ruby Academy · 课时

性能分析工具

ruby-prof 与 stackprof

性能分析工具 是 CoddyKit 上的免费 Ruby Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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 方法自身消耗的时间
  • total 包括被调用方法在内的总时间
  • calls 被调用的次数

请先关注 %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 模式或挂钟模式
  • 遵循重现、分析、优化、再次分析的循环

接下来您将减少内存分配。

常见问题解答

「性能分析工具」课时是免费的吗?

是的 — 「性能分析工具」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Ruby Academy 课程的其余内容,请升级到 CoddyKit PRO。 Ruby Academy 课程共包含 4 节课。

「性能分析工具」这节课中我会学到什么?

ruby-prof 与 stackprof 你通过在浏览器中直接运行的动手代码来练习 Ruby Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Ruby Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Ruby Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「性能分析工具」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Ruby Academy 课中编写并运行代码吗?

能。每节 Ruby Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 测量性能
  2. 性能分析工具
  3. 内存优化
  4. 常见瓶颈
← 返回 Ruby Academy