如何让ruby教授忽略ruby核心/标准库/gem方法



我是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 core/stdlib代码内部的时间,而其他gem只计算为我代码内的时间。

一旦我发现我的代码有一个方法foo,这是一个性能瓶颈,因为它被调用了数千次,并且性能不好,那么我只想查看我的代码和在该特定方法中调用的核心/库代码之间的时间细分。

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

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

使用ruby prof,您还可以尝试输出KCacheGrind格式,并使用KCacheGrindViewer进行分析。它有许多可视化模式,便于对结果进行特别筛选和探索。

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

可在Ruby 2.0中使用,或作为Ruby 1.9及更低版本的Gem使用。

至于以相同的方式评测require 'profile',并将其用于相同的测试。

这篇博客文章详细介绍了如何做到这一点,我认为它没有太大的变化。

相关内容

  • 没有找到相关文章

最新更新