6

我是 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_htmland -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 核心/标准库。我错过了什么?

4

2 回答 2

2

我同意这是 ruby​​-prof 的一个大问题。我更喜欢perftools.rb。它与gperftools集成,支持各种关注和忽略选项,以及非常适合快速了解热点及其调用树的图形报告。

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

于 2013-08-11T16:38:57.323 回答
0

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

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

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

This blog post详细介绍了如何做到这一点,我不相信它已经发生了很大变化。

于 2013-08-11T12:51:53.990 回答