8.3 Benchmarking Ruby Code

How much time did it take?

The sleep method is used to suspend the current thread for some amount of time. Lets look at a simple way to measure the actual time that the method can take to completely execute:

Example Code:

Output Window

And now, I want you to use Ruby's super-awesome blocks to create a method which takes in a block, executes it, and returns the time it took.

Output Window

The Ruby standard library has a Benchmark class - it can do what the code in the above exercise can, and more. Let us take it for a quick spin!

Example Code:

Output Window

The measure method gives you the time taken to execute the block of code - similar to the exercise we just solved. It is already present in the Ruby standard library, has more functionality and is easy to use.

Now let us break down those numbers a bit. The first column is the "user cpu time". This is the time spent by the code executing userspace code (in our case, the code we've written and the Ruby library methods that are invoked by that code).

The second column is "system cpu time" - this is the time taken by the system (kernel) to execute any system level functions needed by your code.

The third column is the sum of both the cpu and user times - it is the total amount of time spent by the CPU to execute your code - this includes the user cpu time, system cpu time and any time spent waiting because the cpu had nothing to do. This wait is due to the time taken for I/O (disk reads and writes, network wait etc.) to happen.

A common use case of benchmarking is to compare the performance of different implementations of the same functionality. The Benchmark class provides the method bm for this.

Example Code:

Output Window

As you can see in the above benchmark, using the << operator or map is faster than building a new array to add each number.

A lesson that talks about benchmarking and code optimization is not complete without Donald Knuth's piece of wisdom: "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil". Optimization is best left for the last - once you have identified the exact places where performance bottlenecks happen and optimize just them. More on premature optimization on the c2 wiki.

Congratulations, guest!


% of the book completed

or

This lesson is Copyright © 2011-2014 by Jasim A Basheer