如何让ruby-prof忽略Ruby核心/标准库/ gem方法?

时间:2013-08-11 11:57:33

标签: ruby performance profiling ruby-prof

我是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。我错过了什么?

2 个答案:

答案 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详细说明了如何执行此操作,我认为它没有太大变化。