benchmark_driver 0.15.11 → 0.15.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c0053583af2abfde832055eff70cefad2490bfc964fecec491bfcf31c6f0770
4
- data.tar.gz: d418a089c5a83abc8ee92f34e522c5119edcaa4a8077739f331e5d0b2f13d12f
3
+ metadata.gz: 4c069979523cfd025fba37653a117db89a52062bfedd7fe3d2c8b8ef5eaab329
4
+ data.tar.gz: 23f32d6a140120ccbddd2ce704590cde72496fc0e7834674fecc865d04e8c943
5
5
  SHA512:
6
- metadata.gz: c7849db1545aa8c304afa85f6d760335eda341a3e23374b6182e992a6e269a3b42fea0159abb34b070c8bbe342d1cebd300b154c155cce427eedbabf365b3ad8
7
- data.tar.gz: eb9f938aa863981a1d90e7f5b6b0c8bd103c70e5fbae7a859c84868ee4f1782c1f93db7f8b87273da138acbd642ba54f41b2e81e89f1f96fc971eef971ab57b1
6
+ metadata.gz: d9d9a2cde658660d21dcf36a2ff872ac42c7a518aaf2a917744eacbcf8e2e95814ded6edb140a3b9d23273291850a2948cc47c09297d5b973b531da3a2582fd5
7
+ data.tar.gz: 48a7c466c98a4304c3cc44bcfc7adf2d277c546e226cb3082999a1a384f038f969c7782b338b851bafd9c319d2d1aad4adca243b1c358346a2b79c1ca0ac0c78
@@ -1,3 +1,7 @@
1
+ # v0.15.12
2
+
3
+ - Show comparison on `--output=markdown` when `--output-compare` is also specified
4
+
1
5
  # v0.15.11
2
6
 
3
7
  - Correctly calculate an average result on `--repeat-result=average`
@@ -117,17 +117,17 @@ class BenchmarkDriver::Output::Compare
117
117
 
118
118
  def humanize(value, width = 10)
119
119
  if BenchmarkDriver::Result::ERROR.equal?(value)
120
- return " %#{width}s" % 'ERROR'
120
+ return sprintf(" %*s", width, 'ERROR')
121
121
  elsif value == 0.0
122
- return " %#{width}.3f" % 0.0
122
+ return sprintf(" %*.3f", width, 0.0)
123
123
  elsif value < 0
124
124
  raise ArgumentError.new("Negative value: #{value.inspect}")
125
125
  end
126
126
 
127
127
  scale = (Math.log10(value) / 3).to_i
128
- return "%#{width}s" % value.to_s if scale < 0 # like 1.23e-04
128
+ return sprintf("%*s", width, value.to_s) if scale < 0 # like 1.23e-04
129
129
 
130
- prefix = "%#{width}.3f" % (value.to_f / (1000 ** scale))
130
+ prefix = sprintf("%*.3f", width, (value.to_f / (1000 ** scale)))
131
131
  suffix =
132
132
  case scale
133
133
  when 1; 'k'
@@ -173,7 +173,7 @@ class BenchmarkDriver::Output::Compare
173
173
  $stdout.puts "\nComparison:"
174
174
 
175
175
  @job_context_result.each do |job, context_result|
176
- $stdout.puts("%#{@name_length + 2 + 11}s" % job)
176
+ $stdout.printf("%*s\n", @name_length + 2 + 11, job)
177
177
  results = context_result.flat_map do |context, result|
178
178
  result.values.values.map { |value| Result.new(job: job, value: value, context: context) }
179
179
  end
@@ -188,7 +188,7 @@ class BenchmarkDriver::Output::Compare
188
188
 
189
189
  unless BenchmarkDriver::Result::ERROR.equal?(bottom)
190
190
  ratio = top / bottom
191
- "- %.2fx #{@metrics.first.worse_word}" % ratio
191
+ sprintf("- %.2fx %s", ratio, @metrics.first.worse_word)
192
192
  end
193
193
  end
194
194
 
@@ -211,7 +211,7 @@ class BenchmarkDriver::Output::Compare
211
211
  else
212
212
  name = result.job
213
213
  end
214
- $stdout.puts("%#{@name_length}s: %11.1f %s #{slower}" % [name, result.value, @metrics.first.unit])
214
+ $stdout.printf("%*s: %11.1f %s %s\n", @name_length, name, result.value, @metrics.first.unit, slower)
215
215
  end
216
216
  $stdout.puts
217
217
  end
@@ -1,13 +1,19 @@
1
1
  class BenchmarkDriver::Output::Markdown
2
2
  NAME_LENGTH = 8
3
3
 
4
+ OPTIONS = {
5
+ compare: ['--output-compare', 'Show comparison between results'],
6
+ }
7
+
4
8
  # @param [Array<BenchmarkDriver::Metric>] metrics
5
9
  # @param [Array<BenchmarkDriver::Job>] jobs
6
10
  # @param [Array<BenchmarkDriver::Context>] contexts
7
- def initialize(metrics:, jobs:, contexts:)
11
+ def initialize(metrics:, jobs:, contexts:, options:)
8
12
  @metrics = metrics
13
+ @contexts = contexts
9
14
  @context_names = contexts.map(&:name)
10
15
  @name_length = jobs.map(&:name).map(&:size).max
16
+ @compare = options.fetch(:compare, false)
11
17
  end
12
18
 
13
19
  def with_warmup(&block)
@@ -28,14 +34,15 @@ class BenchmarkDriver::Output::Markdown
28
34
  # Show executable names
29
35
  $stdout.print("|#{' ' * @name_length} ")
30
36
  @context_names.each do |context_name|
31
- $stdout.print("|%#{NAME_LENGTH}s" % context_name) # same size as humanize
37
+ $stdout.printf("|%*s", NAME_LENGTH, context_name) # same size as humanize
32
38
  end
33
39
  $stdout.puts('|')
34
40
 
35
41
  # Show header separator
36
42
  $stdout.print("|:#{'-' * (@name_length - 1)}--")
37
43
  @context_names.each do |context_name|
38
- $stdout.print("|#{'-' * (NAME_LENGTH - 1)}:") # same size as humanize
44
+ length = [context_name.length, NAME_LENGTH].max
45
+ $stdout.print("|#{'-' * (length - 1)}:") # same size as humanize
39
46
  end
40
47
  $stdout.puts('|')
41
48
 
@@ -48,24 +55,33 @@ class BenchmarkDriver::Output::Markdown
48
55
  # @param [BenchmarkDriver::Job] job
49
56
  def with_job(job, &block)
50
57
  if @with_benchmark
51
- $stdout.print("|%-#{@name_length}s " % job.name)
58
+ @job_context_result = {} if @context_names.size > 1
59
+
60
+ $stdout.printf("|%-*s ", @name_length, job.name)
52
61
  end
53
62
  block.call
54
63
  ensure
55
64
  if @with_benchmark
56
65
  $stdout.puts('|')
66
+ compare_executables if @compare && @context_names.size > 1
57
67
  end
58
68
  end
59
69
 
60
70
  # @param [BenchmarkDriver::Context] context
61
71
  def with_context(context, &block)
72
+ @context = context
62
73
  block.call
63
74
  end
64
75
 
65
76
  # @param [BenchmarkDriver::Result] result
66
77
  def report(result)
78
+ if defined?(@job_context_result)
79
+ @job_context_result[@context] = result
80
+ end
81
+
67
82
  if @with_benchmark
68
- $stdout.print("|%#{NAME_LENGTH}s" % humanize(result.values.fetch(@metrics.first)))
83
+ length = [NAME_LENGTH, @context.name.length].max
84
+ $stdout.printf("|%*s", length, humanize(result.values.fetch(@metrics.first)))
69
85
  else
70
86
  $stdout.print '.'
71
87
  end
@@ -83,15 +99,15 @@ class BenchmarkDriver::Output::Markdown
83
99
 
84
100
  def humanize(value)
85
101
  if BenchmarkDriver::Result::ERROR.equal?(value)
86
- return "%#{NAME_LENGTH}s" % 'ERROR'
102
+ return sprintf("%*s", NAME_LENGTH, 'ERROR')
87
103
  elsif value == 0.0
88
- return "%#{NAME_LENGTH}.3f" % 0.0
104
+ return sprintf("%*.3f", NAME_LENGTH, 0.0)
89
105
  elsif value < 0
90
106
  raise ArgumentError.new("Negative value: #{value.inspect}")
91
107
  end
92
108
 
93
109
  scale = (Math.log10(value) / 3).to_i
94
- prefix = "%#{NAME_LENGTH - 1}.3f" % (value.to_f / (1000 ** scale))
110
+ prefix = sprintf("%*.3f", NAME_LENGTH - 1, (value.to_f / (1000 ** scale)))
95
111
  suffix =
96
112
  case scale
97
113
  when 1; 'k'
@@ -104,4 +120,30 @@ class BenchmarkDriver::Output::Markdown
104
120
  end
105
121
  "#{prefix}#{suffix}"
106
122
  end
123
+
124
+ def compare_executables
125
+ order = @metrics.first.larger_better ? :min_by : :max_by
126
+ worst, worst_result = @job_context_result.__send__(order) do |_, result|
127
+ result.values.first[1]
128
+ end
129
+ worst_result = worst_result.values.first[1]
130
+ $stdout.print("|", " " * (@name_length + 2))
131
+ @job_context_result.each do |context, result|
132
+ if context == worst
133
+ result = '-'
134
+ else
135
+ result = result.values.first[1]
136
+ if order == :min_by
137
+ result = result.fdiv(worst_result)
138
+ else
139
+ result = best_result.fdiv(worst_result)
140
+ end
141
+ result = sprintf("%.2fx", result)
142
+ end
143
+ length = [context.name.length, NAME_LENGTH].max
144
+ $stdout.printf("|%*s", length, result)
145
+ end
146
+ $stdout.puts('|')
147
+ end
148
+
107
149
  end
@@ -1,3 +1,3 @@
1
1
  module BenchmarkDriver
2
- VERSION = '0.15.11'
2
+ VERSION = '0.15.12'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: benchmark_driver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.11
4
+ version: 0.15.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-11 00:00:00.000000000 Z
11
+ date: 2020-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -146,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
146
  - !ruby/object:Gem::Version
147
147
  version: '0'
148
148
  requirements: []
149
- rubygems_version: 3.1.0.pre1
149
+ rubygems_version: 3.2.0.pre1
150
150
  signing_key:
151
151
  specification_version: 4
152
152
  summary: Fully-featured accurate benchmark driver for Ruby