性能分析工具
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或: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 模式或挂钟模式
- 遵循重现、分析、优化、再次分析的循环
接下来您将减少内存分配。
常见问题解答
「性能分析工具」课时是免费的吗?
是的 — 「性能分析工具」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 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 反馈 — 无需本地设置。