除了ruby-prof和核心基准测试类,你还用什么来分析你的Ruby代码呢?特别是,您如何找到代码中的瓶颈?我几乎感觉我需要在我自己的小工具上工作,只是为了弄清楚我的代码中所有的时间都花在了哪里。
我知道ruby-prof提供了这一点,但坦率地说,输出非常令人困惑,并且不容易找出您自己的代码的哪些实际块是问题的根源(它会告诉您哪些方法调用花费的时间最多)。因此,我并没有真正从它中获得我想要的东西,也没有真正能够利用它。
也许我做错了?还有别的选择吗?谷歌搜索没有给我找到任何东西。
发布于 2015-06-30 00:35:13
要真正深入到您的代码中,请尝试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
(brew install graphviz
) dot -T pdf -o stackprof.pdf stackprof.dot
得到一个漂亮的PDF输出,它突出显示了需要很长时间才能运行的方法。
发布于 2017-07-13 02:57:33
还有来自Ruby源代码中的ruby -rprofile
或等效的require 'profile'
文档:
https://ruby-doc.org/stdlib-2.1.0/libdoc/profiler/rdoc/Profiler__.html
https://stackoverflow.com/questions/4092641
复制相似问题