独立Ruby代码(gem)的性能和资源测试

独立Ruby代码(gem)的性能和资源测试,ruby,performance,resources,rubygems,Ruby,Performance,Resources,Rubygems,我有一块宝石,可以做一些艰难的数字运算:它可以从图像中裁剪出“有趣”的部分。为此,我设置了几个算法。总的来说,它只是表现不好;显然,我想改进:) 我想测试和测量三件事: 内存使用 CPU使用率 在方法/例程中花费的总时间 我想对此进行研究,并比较各种算法、参数和设置的值 是否有一些Ruby功能、gem或类似的东西,可以让我运行代码、更改一些参数或代码、再次运行并比较结果 顺便说一句,我已经有了test:unit和shoulda,所以如果有什么东西使用这些测试框架,那就好了。您可以使用标准的“

我有一块宝石,可以做一些艰难的数字运算:它可以从图像中裁剪出“有趣”的部分。为此,我设置了几个算法。总的来说,它只是表现不好;显然,我想改进:)

我想测试和测量三件事:

  • 内存使用
  • CPU使用率
  • 在方法/例程中花费的总时间
我想对此进行研究,并比较各种算法、参数和设置的值

是否有一些Ruby功能、gem或类似的东西,可以让我运行代码、更改一些参数或代码、再次运行并比较结果


顺便说一句,我已经有了test:unit和shoulda,所以如果有什么东西使用这些测试框架,那就好了。

您可以使用标准的“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基准测试软件,那么您应该看一看(并让我知道您的进展如何)


现在仔细阅读您的问题后,我意识到这并不能让您实现流程自动化。

我在ruby prof方面有很好的经验:


在网上的某个地方也有一个很好的介绍,介绍了各种评测方法,但我记不起标题和作者,现在很难找到它……:-(

我使用过它,也玩过它,但它有很多小故障和bug。而且(对我来说)真正有趣的部分需要一个经过修补和重新编译的ruby,快速测试需要大量工作:)