benchmark-ips 2.11.0 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 194a6da5977a23dc733ade6dadaefe1a7d7215678d6135ff33d5c37304bec993
4
- data.tar.gz: e072ffd46009a79e13990e7435e1415ec24fd0407f86d566208fc597b8e33f7d
3
+ metadata.gz: bc54b5cf0d24b23822486adf5759cceeefbef9a60c780454318472f4739050f6
4
+ data.tar.gz: ea2764b060fef8c931c4636eb63e84d48f98242f7335648fed8b82b2fdeb053d
5
5
  SHA512:
6
- metadata.gz: 5b3a8e41f223d3945daf11329e7cd68b1cc41f9b08b9f3f2e9e5a471a37134782f4e1f78caca102b7b3b08eb179ac4d78868bb1f97bfab4ac1ccef22aa38d42d
7
- data.tar.gz: e5cd27c03050929b8edf402264c0f5a32560550ee6d79456d2513ae9b4a76f763f669a32ba4cc3bf7a45e7c086426631c2ba26724a749192fc637046bfd6a495
6
+ metadata.gz: 72ed2d83e42b125ca812aa1e79113be4726f8bb2e0ca4cb784dddc1d70eddc16c088308e1214cba9f7ec83ad77d89d9ae544b7892b6abac8f3e0b88d1617e7a8
7
+ data.tar.gz: 94bda95d5db4a9032692e732a04eb3147ad3839b0e674f13d676b1fdf2130a8f0a269e6f5817791683965bf86662be10c7e5476e0539d71916b6b35562ac7806
data/History.md CHANGED
@@ -1,3 +1,8 @@
1
+ ### 2.12.0 / 2023-03-08
2
+
3
+ * Feature
4
+ * Adds MultiReport and ability report to a stream rather than a string.
5
+
1
6
  ### 2.11.0 / 2023-02-15
2
7
 
3
8
  * Feature
data/LICENSE CHANGED
File without changes
data/README.md CHANGED
File without changes
data/examples/advanced.rb CHANGED
File without changes
data/examples/hold.rb CHANGED
File without changes
data/examples/save.rb CHANGED
File without changes
File without changes
File without changes
@@ -0,0 +1,67 @@
1
+ module Benchmark
2
+ module IPS
3
+ class Job
4
+ class MultiReport
5
+ # @returns out [Array<StreamReport>] list of reports to send output
6
+ attr_accessor :out
7
+
8
+ def empty?
9
+ @out.empty?
10
+ end
11
+
12
+ def quiet?
13
+ @out.none? { |rpt| rpt.kind_of?(StreamReport) }
14
+ end
15
+
16
+ def quiet!
17
+ @out.delete_if { |rpt| rpt.kind_of?(StreamReport) }
18
+ end
19
+
20
+ # @param report [StreamReport] report to accept input?
21
+ def <<(report)
22
+ if report.kind_of?(MultiReport)
23
+ self << report.out
24
+ elsif report.kind_of?(Enumerable)
25
+ @out += report
26
+ elsif report
27
+ @out << report
28
+ end
29
+ end
30
+
31
+ # @param out [Array<StreamReport>] list of reports to send output
32
+ def initialize(out = nil)
33
+ @out = []
34
+ self << out
35
+ end
36
+
37
+ def start_warming
38
+ @out.each { |o| o.start_warming if o.respond_to?(:start_warming) }
39
+ end
40
+
41
+ def warming(label, warmup)
42
+ @out.each { |o| o.warming(label, warmup) }
43
+ end
44
+
45
+ def warmup_stats(warmup_time_us, timing)
46
+ @out.each { |o| o.warmup_stats(warmup_time_us, timing) }
47
+ end
48
+
49
+ def start_running
50
+ @out.each { |o| o.start_running if o.respond_to?(:start_running) }
51
+ end
52
+
53
+ def running(label, warmup)
54
+ @out.each { |o| o.running(label, warmup) }
55
+ end
56
+
57
+ def add_report(item, caller)
58
+ @out.each { |o| o.add_report(item, caller) }
59
+ end
60
+
61
+ def footer
62
+ @out.each { |o| o.footer if o.respond_to?(:footer) }
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -1,43 +1,45 @@
1
1
  module Benchmark
2
2
  module IPS
3
3
  class Job
4
- class StdoutReport
5
- def initialize
4
+ class StreamReport
5
+ def initialize(stream = $stdout)
6
6
  @last_item = nil
7
+ @out = stream
7
8
  end
8
9
 
9
10
  def start_warming
10
- $stdout.puts "Warming up --------------------------------------"
11
+ @out.puts RUBY_DESCRIPTION
12
+ @out.puts "Warming up --------------------------------------"
11
13
  end
12
14
 
13
15
  def start_running
14
- $stdout.puts "Calculating -------------------------------------"
16
+ @out.puts "Calculating -------------------------------------"
15
17
  end
16
18
 
17
19
  def warming(label, _warmup)
18
- $stdout.print rjust(label)
20
+ @out.print rjust(label)
19
21
  end
20
22
 
21
23
  def warmup_stats(_warmup_time_us, timing)
22
24
  case format
23
25
  when :human
24
- $stdout.printf "%s i/100ms\n", Helpers.scale(timing)
26
+ @out.printf "%s i/100ms\n", Helpers.scale(timing)
25
27
  else
26
- $stdout.printf "%10d i/100ms\n", timing
28
+ @out.printf "%10d i/100ms\n", timing
27
29
  end
28
30
  end
29
31
 
30
32
  alias_method :running, :warming
31
33
 
32
34
  def add_report(item, caller)
33
- $stdout.puts " #{item.body}"
35
+ @out.puts " #{item.body}"
34
36
  @last_item = item
35
37
  end
36
38
 
37
39
  def footer
38
40
  return unless @last_item
39
41
  footer = @last_item.stats.footer
40
- $stdout.puts footer.rjust(40) if footer
42
+ @out.puts footer.rjust(40) if footer
41
43
  end
42
44
 
43
45
  private
@@ -53,11 +53,15 @@ module Benchmark
53
53
 
54
54
  # Silence output
55
55
  # @return [Boolean]
56
- attr_reader :quiet
56
+ def quiet
57
+ @out.quiet?
58
+ end
57
59
 
58
60
  # Suite
59
- # @return [Benchmark::IPS::NoopSuite]
60
- attr_reader :suite
61
+ # @return [Benchmark::IPS::MultiReport]
62
+ def suite
63
+ @out
64
+ end
61
65
 
62
66
  # Instantiate the Benchmark::IPS::Job.
63
67
  def initialize opts={}
@@ -81,7 +85,7 @@ module Benchmark
81
85
  @stats = :sd
82
86
  @confidence = 95
83
87
 
84
- self.quiet = false
88
+ @out = MultiReport.new(StreamReport.new)
85
89
  end
86
90
 
87
91
  # Job configuration options, set +@warmup+ and +@time+.
@@ -91,24 +95,23 @@ module Benchmark
91
95
  def config opts
92
96
  @warmup = opts[:warmup] if opts[:warmup]
93
97
  @time = opts[:time] if opts[:time]
94
- @suite = opts[:suite] if opts[:suite]
95
98
  @iterations = opts[:iterations] if opts[:iterations]
96
99
  @stats = opts[:stats] if opts[:stats]
97
100
  @confidence = opts[:confidence] if opts[:confidence]
98
101
  self.quiet = opts[:quiet] if opts.key?(:quiet)
99
- self.suite = opts[:suite]
102
+ self.suite = opts[:suite] if opts[:suite]
100
103
  end
101
104
 
102
105
  def quiet=(val)
103
- @stdout = reporter(quiet: val)
106
+ if val # remove instances of StreamReport
107
+ @out.quiet!
108
+ else # ensure there is an instance of StreamReport
109
+ @out << StreamReport.new if @out.quiet?
110
+ end
104
111
  end
105
112
 
106
113
  def suite=(suite)
107
- @suite = suite || Benchmark::IPS::NoopSuite.new
108
- end
109
-
110
- def reporter(quiet:)
111
- quiet ? NoopReport.new : StdoutReport.new
114
+ @out << suite
112
115
  end
113
116
 
114
117
  # Return true if job needs to be compared.
@@ -245,19 +248,19 @@ module Benchmark
245
248
 
246
249
  def run
247
250
  if @warmup && @warmup != 0 then
248
- @stdout.start_warming
251
+ @out.start_warming
249
252
  @iterations.times do
250
253
  run_warmup
251
254
  end
252
255
  end
253
256
 
254
- @stdout.start_running
257
+ @out.start_running
255
258
 
256
259
  @iterations.times do |n|
257
260
  run_benchmark
258
261
  end
259
262
 
260
- @stdout.footer
263
+ @out.footer
261
264
  end
262
265
 
263
266
  # Run warmup.
@@ -265,8 +268,7 @@ module Benchmark
265
268
  @list.each do |item|
266
269
  next if run_single? && @held_results && @held_results.key?(item.label)
267
270
 
268
- @suite.warming item.label, @warmup
269
- @stdout.warming item.label, @warmup
271
+ @out.warming item.label, @warmup
270
272
 
271
273
  Timing.clean_env
272
274
 
@@ -300,8 +302,7 @@ module Benchmark
300
302
  item.call_times cycles
301
303
  end
302
304
 
303
- @stdout.warmup_stats warmup_time_us, @timing[item]
304
- @suite.warmup_stats warmup_time_us, @timing[item]
305
+ @out.warmup_stats warmup_time_us, @timing[item]
305
306
 
306
307
  break if run_single?
307
308
  end
@@ -312,8 +313,7 @@ module Benchmark
312
313
  @list.each do |item|
313
314
  next if run_single? && @held_results && @held_results.key?(item.label)
314
315
 
315
- @suite.running item.label, @time
316
- @stdout.running item.label, @time
316
+ @out.running item.label, @time
317
317
 
318
318
  Timing.clean_env
319
319
 
@@ -355,8 +355,7 @@ module Benchmark
355
355
  rep.show_total_time!
356
356
  end
357
357
 
358
- @stdout.add_report rep, caller(1).first
359
- @suite.add_report rep, caller(1).first
358
+ @out.add_report rep, caller(1).first
360
359
 
361
360
  break if run_single?
362
361
  end
File without changes
File without changes
File without changes
File without changes
File without changes
data/lib/benchmark/ips.rb CHANGED
@@ -5,10 +5,9 @@ require 'benchmark/ips/stats/stats_metric'
5
5
  require 'benchmark/ips/stats/sd'
6
6
  require 'benchmark/ips/stats/bootstrap'
7
7
  require 'benchmark/ips/report'
8
- require 'benchmark/ips/noop_suite'
9
8
  require 'benchmark/ips/job/entry'
10
- require 'benchmark/ips/job/stdout_report'
11
- require 'benchmark/ips/job/noop_report'
9
+ require 'benchmark/ips/job/stream_report'
10
+ require 'benchmark/ips/job/multi_report'
12
11
  require 'benchmark/ips/job'
13
12
 
14
13
  # Performance benchmarking library
@@ -18,10 +17,10 @@ module Benchmark
18
17
  module IPS
19
18
 
20
19
  # Benchmark-ips Gem version.
21
- VERSION = "2.11.0"
20
+ VERSION = "2.13.0"
22
21
 
23
22
  # CODENAME of current version.
24
- CODENAME = "We Do This Once A Year"
23
+ CODENAME = "Long Awaited"
25
24
 
26
25
  # Measure code in block, each code's benchmarked result will display in
27
26
  # iteration per second with standard deviation in given time.
@@ -83,20 +82,15 @@ module Benchmark
83
82
  end
84
83
 
85
84
  module Helpers
85
+ SUFFIXES = ['', 'k', 'M', 'B', 'T', 'Q'].freeze
86
+
86
87
  def scale(value)
87
- scale = (Math.log10(value) / 3).to_i
88
- suffix = case scale
89
- when 1; 'k'
90
- when 2; 'M'
91
- when 3; 'B'
92
- when 4; 'T'
93
- when 5; 'Q'
94
- else
95
- # < 1000 or > 10^15, no scale or suffix
96
- scale = 0
97
- ' '
98
- end
99
- "%10.3f#{suffix}" % (value.to_f / (1000 ** scale))
88
+ scale = (Math.log10(value) / 3).to_i
89
+ scale = 0 if scale < 0 || scale >= SUFFIXES.size
90
+ suffix = SUFFIXES[scale]
91
+ scaled_value = value.to_f / (1000 ** scale)
92
+
93
+ "%10.3f#{suffix}" % scaled_value
100
94
  end
101
95
  module_function :scale
102
96
  end
@@ -1,5 +1,5 @@
1
1
  module Benchmark
2
- # Perform caclulations on Timing results.
2
+ # Perform calculations on Timing results.
3
3
  module Timing
4
4
  # Microseconds per second.
5
5
  MICROSECONDS_PER_SECOND = 1_000_000
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: benchmark-ips
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.0
4
+ version: 2.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Phoenix
@@ -59,9 +59,8 @@ files:
59
59
  - lib/benchmark/ips.rb
60
60
  - lib/benchmark/ips/job.rb
61
61
  - lib/benchmark/ips/job/entry.rb
62
- - lib/benchmark/ips/job/noop_report.rb
63
- - lib/benchmark/ips/job/stdout_report.rb
64
- - lib/benchmark/ips/noop_suite.rb
62
+ - lib/benchmark/ips/job/multi_report.rb
63
+ - lib/benchmark/ips/job/stream_report.rb
65
64
  - lib/benchmark/ips/report.rb
66
65
  - lib/benchmark/ips/share.rb
67
66
  - lib/benchmark/ips/stats/bootstrap.rb
@@ -89,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
88
  - !ruby/object:Gem::Version
90
89
  version: '0'
91
90
  requirements: []
92
- rubygems_version: 3.3.20
91
+ rubygems_version: 3.3.7
93
92
  signing_key:
94
93
  specification_version: 4
95
94
  summary: A iterations per second enhancement to Benchmark.
@@ -1,27 +0,0 @@
1
- module Benchmark
2
- module IPS
3
- class Job
4
- class NoopReport
5
- def start_warming
6
- end
7
-
8
- def start_running
9
- end
10
-
11
- def footer
12
- end
13
-
14
- def warming(a, b)
15
- end
16
-
17
- def warmup_stats(a, b)
18
- end
19
-
20
- def add_report(a, b)
21
- end
22
-
23
- alias_method :running, :warming
24
- end
25
- end
26
- end
27
- end
@@ -1,25 +0,0 @@
1
- module Benchmark
2
- module IPS
3
- class NoopSuite
4
- def start_warming
5
- end
6
-
7
- def start_running
8
- end
9
-
10
- def footer
11
- end
12
-
13
- def warming(a, b)
14
- end
15
-
16
- def warmup_stats(a, b)
17
- end
18
-
19
- def add_report(a, b)
20
- end
21
-
22
- alias_method :running, :warming
23
- end
24
- end
25
- end