如何让 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 方法?的主要内容,如果未能解决你的问题,请参考以下文章