Simple Benchmarking in Ruby
I want to go into a bit of benchmarking. Often on Twitter you will see developers tweet about some statistics around benchmarking that they are doing. So what is the definition of benchmarking? Benchmarking is to evaluate or check (something) by comparison with a standard.
You might want to measure and log execution times to work out what the benchmark of you program is or you could possibly measure the time taken to call a web service, collect this data and then have a way to benchmark performance.
So how can you do this in Ruby? That is the exact question I asked myself; I wanted something simple to measure the User CPU Time, System CPU Time, User + System CPU Time and finally Real Elapsed Time.
Ruby, as usual has us covered. Included in the Standard Library is Benchmark. Therefore, all you need to do is add a require to the benchmark class to pull in all the bits you need.
Here are our requirements, measure the differences between using a for loop, the ‘times’ method and the ‘upto’ method based on 1000000 iterations.
Now drum roll please as this is some hectic code!
user system total real for loop 0.050000 0.000000 0.050000 ( 0.056730) times 0.060000 0.000000 0.060000 ( 0.055071) upto 0.050000 0.000000 0.050000 ( 0.055136)
Easy right? The ‘bm’ method generates sequential reports with labels. Meaning it will display your reports in the order they were executed and with the text passed into the ‘report’ method.
Real nice how about a more real-life example? Hypothetically speaking let us say we have some code that works out whether or not a number is or is not a prime number. We want to measure the execution of this code run 100000 times.
First here is the code we will use to determine whether the number passed in is a prime number.
Here is the code that will measure the execution time:
This code outputs the following on my machine:
user system total real is prime number over 100000 executions 0.300000 0.000000 0.300000 ( 0.295098)
As usual Ruby has us covered with some of it’s awesome built-in functionality. Go forth and benchmark all the things.