开发者

Performance and resource testing of standalone Ruby code (gem)

开发者 https://www.devze.com 2023-02-25 15:20 出处:网络
I have a gem that does some tough numbercrunching: it crops \"interesting\" pa开发者_C百科rts out of an image. For that, I set up several algorithms. Overall, it just performs bad; which, obviously, I

I have a gem that does some tough numbercrunching: it crops "interesting" pa开发者_C百科rts out of an image. For that, I set up several algorithms. Overall, it just performs bad; which, obviously, I want to improve :).

I want to test and measure three things:

  • memory usage
  • CPU-usage
  • overall time spent in a method/routine.

I want to investigate this and compare the values for various algorithms, parameters and set-ups.

Is there some Ruby functionality, a gem or anything like that, which will allow me to run my code, change a few parameters or a little bit of code, run it again and then compare the results?

I have test:unit and shoulda in place already, byt the way, so if there is something that uses these testing frameworks, that is fine.


You can use the 'profiler' library that is standard. It reports the time spent in each of your methods.

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)

This will produce the following output:

  %   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!

Be careful however as this library will hinder your application's performance. The measurements you get from it are only useful when compared with other measurements you obtain with the same method. They can't be used to assess absolute measurements.


I've made good experiences with ruby-prof:

http://ruby-prof.rubyforge.org/

There's also a good presentation on various ways of profiling somewhere on the web, but I can't remember title and author and have a hard time finding it right now... :-(


I was pleasantly surprised by JRuby. If your code runs on that implementation without change and you're familiar with Java benchmarking software you should take a look (and let me know how you get on).

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/

Having now read your question more carefully I realise this doesn't afford you the capability of automating the process.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号