低开销的Ruby分析?

时间:2010-09-28 14:25:28

标签: ruby profiling ruby-prof

我有一个Ruby程序,大约需要4分钟才能完成任务,我想把它缩短到不到1分钟。

我从宝石中尝试了ruby-prof,但是它使运行时间增加到约30分钟,甚至看起来也没有特别好地保持单调性(一些变化可靠地提高了性能 - 与剖面仪一样可靠地降低了性能 - 没有 - 分析器)。此任务也无法真正分解为可以独立进行有意义分析的部分。

目前使用最低开销来分析Ruby代码的最佳方法是什么?

我使用OSX,但如果由于任何原因,探查者需要另一个操作系统,我可能会重启。

编辑:perftools.rb的开销要低得多,但结果看起来很可疑,说实话,超出任何合理的抽样误差 - 至少它必须搞乱GC或i / o缓冲或类似的东西,造成了很多愚蠢的错误归宿。它仍然胜过ruby-prof。

我会保持问题公开,以防有人知道比这更好的事情。

2 个答案:

答案 0 :(得分:6)

我不认为你可以用MRI或YARV做得更好。

然而,Rubinius有一个内置的探查器(只需用-Xprofile调用),开销更少。

使用JRuby,您可以获得所有Java工具,其中包括一些有史以来最好的分析器。即使没有对JRuby的特定支持,这些工具也会非常有用。 Oracle JDK有这个非常酷的 VisualVM 工具,它可以让你可视化你的程序的各种东西(而AFAIK甚至还有一个JRuby插件)。 Oracle JRockit也有一个很棒的分析器。据传Azul JVM有一个绝对令人难以置信的精彩分析器。我认为J9也很棒。当然,还有YourKit

Charles Oliver Nutter和JRuby社区的其他成员最近撰写了一系列关于使用JRuby理解Ruby代码的运行时行为的文章。大多数情况下,这些文章是作为对memprof library for MRI的反应而编写的,因此它们倾向于关注内存分析,但也有一些关于调用分析的内容。

AFAIK,MacRuby的目标之一是能够使用XCode的运行时理解(Instruments and Co.)来实现Ruby,但这更像是一个长期目标,我不知道这是否是目前实现的

以下是Rubinius的一个小例子:

rbx -Xprofile -e'
  Hash.new {|fibs, n|
    fibs[n] = if n < 2 then n else fibs[n-1] + fibs[n-2] end
  }[100]
'

打印哪些:

Total running time: 0.009895000000000001s

  %   cumulative   self                self     total
 time   seconds   seconds      calls  ms/call  ms/call  name
------------------------------------------------------------
   7.59    0.00      0.00        234     0.00     0.01  Hash#find_entry
   5.86    0.00      0.00        419     0.00     0.00  Hash#key_index
   5.49    0.00      0.00        275     0.00     0.00  Hash::Entry#match?
   4.97    0.01      0.00        234     0.00     0.02  Hash#[]

正如您所看到的,Rubinius分析器的一个有趣属性是,因为它可以分析任意Ruby代码,而Rubinius 本身主要是Ruby代码,它可以深入分析 进入系统本身。

答案 1 :(得分:2)

任何为您提供自助时间的分析器,在功能级别进行报告,认为准确性和效率很重要,并为您提供了一个调用图,它基于与原始 gprof中相同的一组概念,有微小的变化。 ruby_prof只是众多例子中的一个。

Here's why that is not good.

Here's a method that actually finds problems, so you can make your code run faster, and you don't have to buy or install anything.

Here's an example of using it to get a big speedup.