2

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

我从 gem 中尝试了 ruby​​-prof,但启用它会将运行时间增加到约 30 分钟,甚至似乎并没有特别好地保持单调性(一些更改可靠地提高了带分析器的性能,并且可靠地降低了不带分析器的性能)。这项任务也不能真正分解成可以有意义地独立分析的部分。

当前以最低开销分析 Ruby 代码的最佳方法是什么?

我使用 OSX,但如果出于任何原因分析器需要另一个操作系统,我可能会重新启动。

编辑:perftools.rb开销要低得多,但说实话,结果看起来相当可疑,远远超出了任何合理的采样错误 - 至少它必须与 GC 或 i/o 缓冲或类似的东西混淆,导致很多愚蠢的错误归因。它仍然胜过 ruby​​-prof。

如果有人知道比这更好的事情,我会保持这个问题。

4

2 回答 2

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 代码的运行时行为的文章。大多数情况下,这些文章是作为对 MRI 的 memprof 库的反应而写的,因此它们倾向于关注内存分析,但也有一些关于调用分析的内容。

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

这是鲁比尼乌斯的一个小例子:

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 代码,它可以深入分析系统本身。

于 2010-09-28T15:33:35.643 回答
2

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

这就是为什么这不好。

这是一个真正发现问题的方法,因此您可以使您的代码运行得更快,并且您无需购买或安装任何东西。

这是一个使用它来获得很大加速的示例。

于 2010-09-28T17:26:00.633 回答