我有一个很难处理数字的gem:它从图像中剪出“有趣”的部分。为此,我设置了几个算法。总的来说,它表现糟糕。显然,我想改善:)。独立Ruby代码(宝石)的性能和资源测试
我想测试和测量三样东西:
- 内存使用
- CPU使用率
- 的方法/例行花费的总时间。
我想调查这一点,并比较各种算法,参数和设置的值。
是否有一些Ruby功能,一个宝石或类似的东西,这将允许我运行我的代码,更改一些参数或一些代码,再次运行它,然后比较结果?
我有测试:单位和应该已经到位,所以如果有东西使用这些测试框架,那很好。
我有一个很难处理数字的gem:它从图像中剪出“有趣”的部分。为此,我设置了几个算法。总的来说,它表现糟糕。显然,我想改善:)。独立Ruby代码(宝石)的性能和资源测试
我想测试和测量三样东西:
我想调查这一点,并比较各种算法,参数和设置的值。
是否有一些Ruby功能,一个宝石或类似的东西,这将允许我运行我的代码,更改一些参数或一些代码,再次运行它,然后比较结果?
我有测试:单位和应该已经到位,所以如果有东西使用这些测试框架,那很好。
您可以使用标准的'profiler'库。它报告你在每种方法中花费的时间。
require 'profiler'
def functionToBeProfiled
a = 0
1000.times do |i|
a = a + i * rand
end
end
Profiler__::start_profile
functionToBeProfiled
Profiler__::stop_profile
Profiler__::print_profile($stdout)
这将产生以下输出:
% cumulative self self total
time seconds seconds calls ms/call ms/call name
16.58 0.03 0.03 1 31.00 93.00 Integer#times
16.58 0.06 0.03 1000 0.03 0.03 Kernel.rand
8.56 0.08 0.02 3 5.33 10.33 RubyLex#identify_identifier
8.56 0.09 0.02 10 1.60 6.20 IRB::SLex::Node#match_io
8.56 0.11 0.02 84 0.19 0.19 Kernel.===
8.56 0.13 0.02 999 0.02 0.02 Float#+
8.56 0.14 0.02 6 2.67 5.33 String#gsub!
不过要小心,因为这个库会阻碍你的应用程序的性能。您从中获得的测量结果只有与使用相同方法获得的其他测量结果相比才有用。它们不能用于评估绝对测量值。
我被JRuby惊喜了。如果你的代码在没有改变的情况下在那个实现上运行,并且你熟悉Java基准测试软件,那么你应该看一看(并且让我知道你是怎么做的)。
http://www.engineyard.com/blog/2010/monitoring-memory-with-jruby-part-1-jhat-and-visualvm/
http://danlucraft.com/blog/2011/03/built-in-profiler-in-jruby-1.6/
现在已经读了你的问题更仔细的我知道这并不提供您自动化过程的能力。
我用它和它一起玩,但它有很多小故障和错误,而真正有趣的部分(对我而言)需要修补和重新编译的ruby,对于快速测试来说,相当多的工作:) – berkes 2011-04-18 15:00:08
在这里找到了一个不错的howto:http://ruby.about.com/od/advancedruby/a/profile.htm – berkes 2011-04-18 15:02:34