我有一个Ruby程序,大约需要4分钟才能完成任务,我想把它降到1分钟以下。
我尝试了宝石的ruby-prof,但允许它将运行时间增加到30分钟,甚至似乎没有特别好地保持单调性(一些更改可靠地提高了性能,并可靠地降低了性能-没有分析器)。这个任务也不能真正地被分解成能够被有意义地独立描述的部分。
当前对开销最低的Ruby代码进行分析的最佳方法是什么?
我使用OSX,但是如果由于任何原因,分析器需要另一个操作系统,我可能会重新启动。
编辑:perftools.rb的开销要低得多,但是结果诚实地看上去相当可疑,远远超出了任何合理的抽样错误--至少它一定是在干扰GC或i/o缓冲区之类的操作,从而导致了许多愚蠢的错误。它仍然胜过红宝石教授。
如果有人知道比这更好的事情,我就把问题提出来。
发布于 2010-09-28 15:33:35
我认为无论是MRI还是YARV,你都不能做得更好。
然而,Rubinius有一个内置的分析器(只需使用-Xprofile调用),开销要小得多。
使用JRuby,您可以获得整个Java数组,其中包括一些有史以来创建的最好的分析器。即使没有对JRuby的特定支持,这些工具也可能非常有用。Oracle有一个非常酷的VisualVM工具,它允许您可视化有关您的程序的各种内容(而且AFAIK甚至还有一个JRuby插件)。甲骨文JRockit也有一个很好的分析器。有传言称,Azul JVM拥有一个绝对令人惊叹的、令人敬畏的剖析器。我认为J9也有一个很棒的。当然,还有YourKit。
Charles和JRuby社区的其他成员最近写了一系列关于使用JRuby理解JRuby代码运行时行为的文章。大多数情况下,这些文章是作为对MRI记忆库的反应编写的,因此它们倾向于关注内存分析,但其中也有一些关于调用分析的内容。
MacRuby的目标之一是能够使用XCode的运行时理解工具( goals 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代码,所以它可以深入到系统本身。
发布于 2010-09-28 17:26:00
任何给你自我时间的分析器,在函数级别的报告,认为准确性和效率很重要,并给你一个调用图,是基于与最初的gprof相同的一组概念,有一些细微的变化。ruby_prof只是众多例子中的一个。
https://stackoverflow.com/questions/3813761
复制相似问题