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

Posted

技术标签:

【中文标题】如何让 ruby​​-prof 忽略 Ruby 核心/标准库/gem 方法?【英文标题】:How do I get ruby-prof to ignore Ruby core / standard library / gem methods? 【发布时间】:2013-08-11 11:57:33 【问题描述】:

我是 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 

这对我来说并不是什么有用的信息,因为我已经知道我的程序经常处理字符串和数组,并且大概这些类已经对它们进行了优化。我只关心 my 代码中的热点。

我尝试了其他一些打印机模式,例如-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,由于被调用了数千次并且性能不佳,这是一个性能瓶颈,那么只有我想查看故障我的代码和在该特定方法中调用的核心/库代码之间经过的时间。

我不明白为什么这不是一个标准功能,因为我希望这是每个人都想做的事情:首先分析您自己的代码,然后一旦您用完了要优化的东西,就可能开始优化您使用的 gem,甚至可能是 Ruby 核心/stdlib。我错过了什么?

【问题讨论】:

【参考方案1】:

我同意这是 ruby​​-prof 的一个大问题。我更喜欢perftools.rb。与gperftools集成,支持各种focus and ignore options,图形化报表,快速了解hotspots and their call trees。

使用 ruby​​-prof,您还可以尝试输出 KCacheGrind 格式并使用KCacheGrind Viewer 进行分析。它有多种可视化模式,便于临时过滤和探索结果。

【讨论】:

【参考方案2】:

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

可用于 Ruby 2.0 或作为 Ruby 1.9 及更低版本的 Gem。

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

这个blog post详细说明了如何做到这一点,我不相信它有很大的变化。

【讨论】:

感谢您的回答,但我的测试套件已经用 RSpec 编写了。我会给 profile 一个机会,但该博客似乎表明它遭受了完全相同的库方法污染结果的问题。 是的,它绝对不是一个完全匹配的答案,但可能会让你更接近。至于使用 RSpec,看看他们在 minitest 中是如何做到的,可能会给你一些线索。 RSpec 只是 Ruby,打开并修改它......也许可以提交一个功能!

以上是关于如何让 ruby​​-prof 忽略 Ruby 核心/标准库/gem 方法?的主要内容,如果未能解决你的问题,请参考以下文章

rails ruby​​-prof 和基准测试

如何在 1.9.2 中分析 Ruby 代码?

分析Ruby代码

如何在 Ruby on Rails 中分析请求?

如何分析 JRuby 代码?

分析一个达到 100% CPU 且永不结束的 ruby​​ 应用程序