要真正深入了解您的代码,请尝试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#blank?
546 (6.0%) 216 (2.4%) ActiveRecord::ConnectionAdapters::Mysql2Adapter#select
212 (2.3%) 199 (2.2%) Mysql2::Client#query_with_timing
190 (2.1%) 155 (1.7%) ERB::Util#html_escape``
在这里,您可以看到所有需要大量时间的方法。现在最棒的部分:钻进去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 输出,它突出显示需要很长时间运行的方法。