低开销的Ruby分析?

taw*_*taw 2 ruby profiling ruby-prof

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

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

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

我使用OSX,但如果由于任何原因,探测器需要另一个操作系统,我可能会重新启动.

编辑:perftools.rb具有更低的开销,但结果看起来相当可疑诚实,超出任何合理的抽样错误 - 至少它必须搞乱GC或i/o缓冲或类似的东西,导致很多愚蠢的错误归因.它仍然击败了ruby-prof.

我会保持问题公开,万一有人知道比这更好的事情.

Jör*_*tag 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库进行MRI的反应而编写的,因此他们倾向于关注内存分析,但也有一些关于调用分析的内容.

AFAIK,MacRuby的目标之一是能够使用XCode的运行时理解(Instruments和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]
'
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

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#[]
Run Code Online (Sandbox Code Playgroud)

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


归档时间:

查看次数:

1305 次

最近记录:

15 年,4 月 前