我是Ruby分析的新手,似乎ruby-prof
是一个受欢迎的选择。我刚刚安装了gem并调用了我的程序:
ruby-prof ./my-prog.rb
但是,输出非常冗长,因为包含了所有Ruby核心和标准库方法以及其他gem的数据分析。例如,前三行是:
8.79 0.011 0.010 0.000 0.001 3343 *String#%
7.28 0.078 0.009 0.000 0.069 2068 *Array#each
4.93 0.038 0.006 0.000 0.032 1098 *Array#map
这对我来说不是一个非常有用的信息,因为我已经知道我的程序经常处理字符串和数组,并且可能这些类已经对它们进行了优化。我只关心我的代码中的热点。
我尝试了其他一些打印机模式,例如-p graph_html
和-p call_stack
,但他们都有同样的问题。
我看到ruby-prof
支持一些方法消除和简化:
-x, --exclude regexp exclude methods by regexp (see method elimination)
-X, --exclude-file file exclude methods by regexp listed in file (see method elimination)
--exclude-common-cycles make common iterators like Integer#times appear inlined
--exclude-common-callbacks make common callbacks invocations like Integer#times appear
但似乎没有任何明显的方法可以获得我真正想要的东西,这是我的代码仅的数据分析,即Ruby核心/ stdlib代码中的时间已过去,以及其他宝石只计算在我的代码中经过的时间。
一旦我看到我的代码有一个方法foo
由于被调用数千次并且性能不佳而导致的性能瓶颈,那么我只想 我的代码和在该特定方法中调用的核心/库代码之间经过的时间细分。
我无法理解为什么这不是一个标准功能,因为我希望这是每个人都想做的事情:首先编写自己的代码,然后一旦你用完了优化的东西,可能会启动优化你使用的宝石,甚至可能是Ruby core / stdlib。我错过了什么?
答案 0 :(得分:2)
我同意这是ruby-prof的一个大问题。我倾向于选择perftools.rb。它与gperftools集成,支持各种focus and ignore options,以及图形报告,这些报告对于快速理解hotspots and their call trees非常有用。
使用ruby-prof,您也可以尝试输出KCacheGrind格式并使用KCacheGrind Viewer进行分析。它具有多种可视化模式,便于临时过滤和探索结果。
答案 1 :(得分:0)
您可能希望通过测试进行分析和基准测试。 Minitest在他们的测试框架中允许这样做。这样你就可以专注于特定的行为来获得你的时间。
可用于Ruby 2.0或作为Ruby 1.9及更低版本的Gem。
就同样的方式进行分析,require 'profile'
并将其用于相同的测试。
此blog post详细说明了如何执行此操作,我认为它没有太大变化。