taw*_*taw 2 ruby profiling ruby-prof
我有一个Ruby程序,大约需要4分钟才能完成任务,我想把它降到1分钟以下.
我尝试了宝石中的ruby-prof,但是它使运行时间增加到约30分钟,甚至看起来都没有特别好地保持单调性(一些变化可靠地提高了性能 - 使用剖析器并且可靠地降低了性能 - 没有剖析器).此任务也无法真正分解为可以独立进行有意义分析的部分.
目前以最低开销分析Ruby代码的最佳方法是什么?
我使用OSX,但如果由于任何原因,探测器需要另一个操作系统,我可能会重新启动.
编辑:perftools.rb具有更低的开销,但结果看起来相当可疑诚实,超出任何合理的抽样错误 - 至少它必须搞乱GC或i/o缓冲或类似的东西,导致很多愚蠢的错误归因.它仍然击败了ruby-prof.
我会保持问题公开,万一有人知道比这更好的事情.
我不认为你可以用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 次 |
| 最近记录: |