Module: Benchmark::Compare

Included in:
Benchmark
Defined in:
lib/benchmark/compare.rb

Overview

Functionality of performaing comparison between reports.

Usage:

Add x.compare! to perform comparison between reports.

Example:

> Benchmark.ips do |x|
  x.report('Reduce using tag')     { [*1..10].reduce(:+) }
  x.report('Reduce using to_proc') { [*1..10].reduce(&:+) }
  x.compare!
end

Calculating -------------------------------------
    Reduce using tag     19216 i/100ms
Reduce using to_proc     17437 i/100ms
-------------------------------------------------
    Reduce using tag   278950.0 (±8.5%) i/s -    1402768 in   5.065112s
Reduce using to_proc   247295.4 (±8.0%) i/s -    1238027 in   5.037299s

Comparison:
    Reduce using tag:   278950.0 i/s
Reduce using to_proc:   247295.4 i/s - 1.13x slower

Besides regular Calculating report, this will also indicates which one is slower.

Instance Method Summary collapse

Instance Method Details

#compare(*reports) ⇒ Object

Compare between reports, prints out facts of each report: runtime, comparative speed difference.

Parameters:

  • reports (Array<Report>)

    Reports to compare.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/benchmark/compare.rb', line 32

def compare(*reports)
  return if reports.size < 2

  iter = false
  sorted = reports.sort do |a,b|
    if a.respond_to? :ips
      iter = true
      b.ips <=> a.ips
    else
      a.runtime <=> b.runtime
    end
  end

  best = sorted.shift

  $stdout.puts "\nComparison:"

  if iter
    $stdout.printf "%20s: %10.1f i/s\n", best.label, best.ips
  else
    $stdout.puts "#{best.rjust(20)}: #{best.runtime}s"
  end

  sorted.each do |report|
    name = report.label.to_s

    if iter
      x = (best.ips.to_f / report.ips.to_f)
      $stdout.printf "%20s: %10.1f i/s - %.2fx slower\n", name, report.ips, x
    else
      x = "%.2f" % (report.ips.to_f / best.ips.to_f)
      $stdout.puts "#{name.rjust(20)}: #{report.runtime}s - #{x}x slower"
    end
  end

  $stdout.puts
end