In Ruby 2.4 when we pass a block to a method which further passes to another
method, ruby creates a new Proc object by the given block before passing this proc to the
This creates unnecessary objects even when block parameter is not accessed.
It also creates a chain of Proc objects when the block parameter is passed
through various methods.
Proc creation is one of heavyweight operation because
we need to store all of local variables (represented by Env objects in MRI internal) to the heap.
Ruby 2.5 introduced lazy proc allocation.
Ruby 2.5 does not create Proc object
while passing a block to another method.
It rather passes the block information.
If the block is accessed somewhere then it creates a Proc object by the given block.
This resulted in lesser memory allocation and faster execution.
As we can see there is considerable improvement in execution time in Ruby 2.5 when
a block param is passed.