如果您想深入了解代码,可以试用 stackprof 。
以下是如何使用它的快速解决方案:
安装 gem:gem install stackprof
。在您的代码中添加:require 'stackprof'
并将您想要检查的部分用以下方式包围:
StackProf.run(mode: :cpu, out: 'stackprof-output.dump') do
{YOUR_CODE}
end
在运行 Ruby 脚本后,可以使用stackprof stackprof.dump
在终端中检查输出:
Mode: cpu(1000)
Samples: 9145 (1.25% miss rate)
GC: 448 (4.90%)
TOTAL (pct) SAMPLES (pct) FRAME
236 (2.6%) 231 (2.5%) String
546 (6.0%) 216 (2.4%) ActiveRecord::ConnectionAdapters::Mysql2Adapter
212 (2.3%) 199 (2.2%) Mysql2::Client
190 (2.1%) 155 (1.7%) ERB::Util
在这里,您可以看到所有需要大量时间的方法。现在是最棒的部分:要深入了解,请执行stackprof stackprof.dump --method String#blank?
,您将获得特定方法的输出:
String#blank? (lib/active_support/core_ext/object/blank.rb:80)
samples: 231 self (2.5%) / 236 total (2.6%)
callers:
112 ( 47.5%) Object#present?
code:
| 80 | def blank?
187 (2.0%) / 187 (2.0%) | 81 | self !~ /[^[:space:]]/
| 82 | end
您可以很容易地找出代码中哪部分运行时间较长。
如果想要获得可视化输出,请执行 stackprof stackprof.dump --graphviz >> stackprof.dot
并使用 graphviz (brew install graphviz
) 执行 dot -T pdf -o stackprof.pdf stackprof.dot
,以获得漂亮的 PDF 输出,其中突出显示了运行时间较长的方法。