我有一个Ruby程序,大约需要4分钟才能完成任务,我想把它缩短到不到1分钟。
我从宝石中尝试了ruby-prof,但是它使运行时间增加到约30分钟,甚至看起来也没有特别好地保持单调性(一些变化可靠地提高了性能 - 与剖面仪一样可靠地降低了性能 - 没有 - 分析器)。此任务也无法真正分解为可以独立进行有意义分析的部分。
目前使用最低开销来分析Ruby代码的最佳方法是什么?
我使用OSX,但如果由于任何原因,探查者需要另一个操作系统,我可能会重启。
编辑:perftools.rb
的开销要低得多,但结果看起来很可疑,说实话,超出任何合理的抽样误差 - 至少它必须搞乱GC或i / o缓冲或类似的东西,造成了很多愚蠢的错误归宿。它仍然胜过ruby-prof。
我会保持问题公开,以防有人知道比这更好的事情。
答案 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只是众多例子中的一个。