def perform_something(&block) start = Time.monotonic yield Time.monotonic - start end def perform_benchmark_average(ntimes : Int32, &block) i = 1 sum = Time::Span.zero while i <= ntimes elapsed_time = perform_something &block sum += elapsed_time i += 1 end sum / ntimes end def perform_benchmark_average_verbose(title : String, ntimes : Int32, &block) i = 1 sum = Time::Span.zero puts "Execute '#{title}' × #{ntimes}" while i <= ntimes elapsed_time = perform_something &block sum += elapsed_time STDOUT.write "\relapsed_time: #{elapsed_time}, average: #{sum/i}".to_slice i += 1 end puts "" puts "Average: #{sum/ntimes}" end