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

Ada*_*ers 6 ruby performance profiling ruby-prof

我是Ruby分析的新手,它似乎ruby-prof是一个受欢迎的选择.我刚刚安装了gem并调用了我的程序:

ruby-prof ./my-prog.rb
Run Code Online (Sandbox Code Playgroud)

但是,输出非常冗长,因为包含了所有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 
Run Code Online (Sandbox Code Playgroud)

这对我来说并不是一个非常有用的信息,因为我已经知道我的程序经常处理字符串和数组,并且可能这些类已经对它们进行了优化.我只关心热点我的代码.

我尝试了一些其他的打印机模式,例如-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
Run Code Online (Sandbox Code Playgroud)

但似乎没有要任何明显的方式得到我真正想要的,这是我的代码分析数据,即从红宝石核心/ STDLIB经过内部代码的时间,而且随着时间的流逝里其他宝石只正在清点我码.

有一次,我可以看到我的代码有一个方法foo是一个性能瓶颈,由于被调用数千次,表现不好,然后和只有做我想看看我的代码和核心/库代码调用中之间经过时间的故障那种特殊的方法.

我不明白为什么这不是一个标准功能,因为我希望每个人都想做的事情:首先描述你自己的代码,然后一旦你用完了优化的东西,可能会开始优化宝石你使用甚至可能是Ruby core/stdlib.我错过了什么?

vgo*_*off 0

您可能希望通过测试进行分析和基准测试。Minitest 在他们的测试框架中允许这样做。这样你就可以专注于特定的行为来获得你的时间安排。

在 Ruby 2.0 中可用,或者在 Ruby 1.9 及更低版本中作为 Gem 提供。

至于以相同的方式进行分析,require 'profile'并将其用于相同的测试。

这篇博文详细介绍了如何做到这一点,我不相信它有很大的改变。