benchmark-ips 2.8.3 → 2.9.2

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: 4bd1437bad08cae3326e3598e00e6de5cc934ed419030cfff810fe3b213de495
4
- data.tar.gz: 56b66543830a961b3e960b290205cb80d41229fb1bf5964d223f0af8438d1587
3
+ metadata.gz: c22ac46ad04849b7302dc6cc8c1fe2521c73d16fa9f47e1b0af7abf175d11d1f
4
+ data.tar.gz: 2ea1a4d8b23e6efd542c204b8e557734ea4cf6c5aebc51db8aca2ac036cd2bdf
5
5
  SHA512:
6
- metadata.gz: c8c7375472f21ef4403327d993cc71c9b000390507a69dfaeac60b3a149a60059bfd28f3aace273ffdb81c069084d091d67154bc77a72f0402d92f21da4568db
7
- data.tar.gz: 1edd46fee8de839431b479d7dfaa01ac95b0a7d620cb85494ca6262786b87dc372df96eb9eff7ddced14e0b6e3168bc282687a8cd2653b557cb947665a615568
6
+ metadata.gz: 9bdfb5486834ee180b70371299387eb0fc6e6137de5d17e9e547618ba12cb72cb845893915c0195f6153ef44b4adb8ba6138504d31de4a2f523d638375cb2794
7
+ data.tar.gz: c597571580a1379603e0789b98f0d9eb0fde836d409f257474c24b39d1557a681b78c7a2d239dcc725acbbc07ed3dcca59681b23574b8c29770f63a7f36835c5
data/History.txt CHANGED
@@ -1,11 +1,32 @@
1
+ === 2.9.2 / 2021-10-10
2
+
3
+ * Bug fix
4
+ * Fix a problem with certain configs of quiet mode
5
+
6
+ === 2.9.1 / 2021-05-24
7
+
8
+ * Bug fix
9
+ * Include all files in gem
10
+
11
+ === 2.9.0 / 2021-05-21
12
+
13
+ * Features
14
+ * Suite can now be set via an accessor
15
+ * Default SHARE_URL is now `ips.fastruby.io`, operated by Ombu Labs.
16
+
17
+ === 2.8.4 / 2020-12-03
18
+
19
+ * Bug fix
20
+ * Fixed hold! when results file does not exist.
21
+
1
22
  === 2.8.3 / 2020-08-28
2
23
 
3
- * Bug fix
24
+ * Bug fix
4
25
  * Fixed inaccuracy caused by integer overflows.
5
26
 
6
27
  === 2.8.2 / 2020-05-04
7
28
 
8
- * Bug fix
29
+ * Bug fix
9
30
  * Fixed problems with Manifest.txt.
10
31
  * Empty interim results files are ignored.
11
32
 
data/Manifest.txt CHANGED
@@ -7,7 +7,9 @@ lib/benchmark/compare.rb
7
7
  lib/benchmark/ips.rb
8
8
  lib/benchmark/ips/job.rb
9
9
  lib/benchmark/ips/job/entry.rb
10
+ lib/benchmark/ips/job/noop_report.rb
10
11
  lib/benchmark/ips/job/stdout_report.rb
12
+ lib/benchmark/ips/noop_suite.rb
11
13
  lib/benchmark/ips/report.rb
12
14
  lib/benchmark/ips/share.rb
13
15
  lib/benchmark/ips/stats/bootstrap.rb
data/README.md CHANGED
@@ -186,11 +186,15 @@ end
186
186
 
187
187
  ### Online sharing
188
188
 
189
- If you want to share quickly your benchmark result with others. Run you benchmark
190
- with `SHARE=1` argument. I.e.: `SHARE=1 ruby my_benchmark.rb`.
191
- Result will be sent to [benchmark.fyi](https://benchmark.fyi/) and benchmark-ips
189
+ If you want to quickly share your benchmark result with others, run you benchmark
190
+ with `SHARE=1` argument. For example: `SHARE=1 ruby my_benchmark.rb`.
191
+
192
+ Result will be sent to [benchmark.fyi](https://ips.fastruby.io/) and benchmark-ips
192
193
  will display the link to share the benchmark's result.
193
194
 
195
+ If you want to run your own instance of [benchmark.fyi](https://github.com/evanphx/benchmark.fyi)
196
+ and share it to that instance, you can do this: `SHARE_URL=https://ips.example.com ruby my_benchmark.rb`
197
+
194
198
  ### Advanced Statistics
195
199
 
196
200
  By default, the margin of error shown is plus-minus one standard deviation. If
@@ -227,7 +231,7 @@ Benchmark.ips do |x|
227
231
 
228
232
  x.stats = :bootstrap
229
233
  x.confidence = 95
230
-
234
+
231
235
  # confidence is 95% by default, so it can be omitted
232
236
 
233
237
  end
@@ -0,0 +1,27 @@
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
@@ -51,16 +51,20 @@ module Benchmark
51
51
  # @return [Integer]
52
52
  attr_accessor :confidence
53
53
 
54
+ # Silence output
55
+ # @return [Boolean]
56
+ attr_reader :quiet
57
+
58
+ # Suite
59
+ # @return [Benchmark::IPS::NoopSuite]
60
+ attr_reader :suite
61
+
54
62
  # Instantiate the Benchmark::IPS::Job.
55
- # @option opts [Benchmark::Suite] (nil) :suite Specify Benchmark::Suite.
56
- # @option opts [Boolean] (false) :quiet Suppress the printing of information.
57
63
  def initialize opts={}
58
- @suite = opts[:suite] || nil
59
- @stdout = opts[:quiet] ? nil : StdoutReport.new
60
64
  @list = []
61
- @compare = false
62
65
  @run_single = false
63
66
  @json_path = false
67
+ @compare = false
64
68
  @held_path = nil
65
69
  @held_results = nil
66
70
 
@@ -75,6 +79,8 @@ module Benchmark
75
79
  # Default statistical model
76
80
  @stats = :sd
77
81
  @confidence = 95
82
+
83
+ self.quiet = false
78
84
  end
79
85
 
80
86
  # Job configuration options, set +@warmup+ and +@time+.
@@ -88,6 +94,20 @@ module Benchmark
88
94
  @iterations = opts[:iterations] if opts[:iterations]
89
95
  @stats = opts[:stats] if opts[:stats]
90
96
  @confidence = opts[:confidence] if opts[:confidence]
97
+ self.quiet = opts[:quiet] if opts.key?(:quiet)
98
+ self.suite = opts[:suite]
99
+ end
100
+
101
+ def quiet=(val)
102
+ @stdout = reporter(quiet: val)
103
+ end
104
+
105
+ def suite=(suite)
106
+ @suite = suite || Benchmark::IPS::NoopSuite.new
107
+ end
108
+
109
+ def reporter(quiet:)
110
+ quiet ? NoopReport.new : StdoutReport.new
91
111
  end
92
112
 
93
113
  # Return true if job needs to be compared.
@@ -188,7 +208,7 @@ module Benchmark
188
208
  end
189
209
 
190
210
  def load_held_results
191
- return unless @held_path && !File.zero?(@held_path)
211
+ return unless @held_path && File.exist?(@held_path) && !File.zero?(@held_path)
192
212
  require "json"
193
213
  @held_results = {}
194
214
  JSON.load(IO.read(@held_path)).each do |result|
@@ -223,19 +243,19 @@ module Benchmark
223
243
 
224
244
  def run
225
245
  if @warmup && @warmup != 0 then
226
- @stdout.start_warming if @stdout
246
+ @stdout.start_warming
227
247
  @iterations.times do
228
248
  run_warmup
229
249
  end
230
250
  end
231
251
 
232
- @stdout.start_running if @stdout
252
+ @stdout.start_running
233
253
 
234
254
  @iterations.times do |n|
235
255
  run_benchmark
236
256
  end
237
257
 
238
- @stdout.footer if @stdout
258
+ @stdout.footer
239
259
  end
240
260
 
241
261
  # Run warmup.
@@ -243,8 +263,8 @@ module Benchmark
243
263
  @list.each do |item|
244
264
  next if run_single? && @held_results && @held_results.key?(item.label)
245
265
 
246
- @suite.warming item.label, @warmup if @suite
247
- @stdout.warming item.label, @warmup if @stdout
266
+ @suite.warming item.label, @warmup
267
+ @stdout.warming item.label, @warmup
248
268
 
249
269
  Timing.clean_env
250
270
 
@@ -280,8 +300,8 @@ module Benchmark
280
300
  item.call_times cycles
281
301
  end
282
302
 
283
- @stdout.warmup_stats warmup_time_us, @timing[item] if @stdout
284
- @suite.warmup_stats warmup_time_us, @timing[item] if @suite
303
+ @stdout.warmup_stats warmup_time_us, @timing[item]
304
+ @suite.warmup_stats warmup_time_us, @timing[item]
285
305
 
286
306
  break if run_single?
287
307
  end
@@ -292,8 +312,8 @@ module Benchmark
292
312
  @list.each do |item|
293
313
  next if run_single? && @held_results && @held_results.key?(item.label)
294
314
 
295
- @suite.running item.label, @time if @suite
296
- @stdout.running item.label, @time if @stdout
315
+ @suite.running item.label, @time
316
+ @stdout.running item.label, @time
297
317
 
298
318
  Timing.clean_env
299
319
 
@@ -334,8 +354,8 @@ module Benchmark
334
354
  rep.show_total_time!
335
355
  end
336
356
 
337
- @stdout.add_report rep, caller(1).first if @stdout
338
- @suite.add_report rep, caller(1).first if @suite
357
+ @stdout.add_report rep, caller(1).first
358
+ @suite.add_report rep, caller(1).first
339
359
 
340
360
  break if run_single?
341
361
  end
@@ -0,0 +1,25 @@
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/http'
2
4
  require 'net/https'
3
5
  require 'json'
@@ -5,7 +7,7 @@ require 'json'
5
7
  module Benchmark
6
8
  module IPS
7
9
  class Share
8
- DEFAULT_URL = "https://benchmark.fyi"
10
+ DEFAULT_URL = "https://ips.fastruby.io"
9
11
  def initialize(report, job)
10
12
  @report = report
11
13
  @job = job
data/lib/benchmark/ips.rb CHANGED
@@ -5,8 +5,10 @@ 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'
8
9
  require 'benchmark/ips/job/entry'
9
10
  require 'benchmark/ips/job/stdout_report'
11
+ require 'benchmark/ips/job/noop_report'
10
12
  require 'benchmark/ips/job'
11
13
 
12
14
  # Performance benchmarking library
@@ -16,10 +18,10 @@ module Benchmark
16
18
  module IPS
17
19
 
18
20
  # Benchmark-ips Gem version.
19
- VERSION = "2.8.3"
21
+ VERSION = "2.9.2"
20
22
 
21
23
  # CODENAME of current version.
22
- CODENAME = "Tardy Turtle"
24
+ CODENAME = "Sleepy Sasquatch"
23
25
 
24
26
  # Measure code in block, each code's benchmarked result will display in
25
27
  # iteration per second with standard deviation in given time.
@@ -33,23 +35,14 @@ module Benchmark
33
35
  time, warmup, quiet = args
34
36
  end
35
37
 
36
- suite = nil
37
-
38
38
  sync, $stdout.sync = $stdout.sync, true
39
39
 
40
- if defined? Benchmark::Suite and Suite.current
41
- suite = Benchmark::Suite.current
42
- end
43
-
44
- quiet ||= (suite && suite.quiet?)
45
-
46
- job = Job.new({:suite => suite,
47
- :quiet => quiet
48
- })
40
+ job = Job.new
49
41
 
50
42
  job_opts = {}
51
43
  job_opts[:time] = time unless time.nil?
52
44
  job_opts[:warmup] = warmup unless warmup.nil?
45
+ job_opts[:quiet] = quiet unless quiet.nil?
53
46
 
54
47
  job.config job_opts
55
48
 
@@ -1,6 +1,7 @@
1
1
  require "minitest/autorun"
2
2
  require "benchmark/ips"
3
3
  require "stringio"
4
+ require "tmpdir"
4
5
 
5
6
  class TestBenchmarkIPS < Minitest::Test
6
7
  def setup
@@ -12,6 +13,13 @@ class TestBenchmarkIPS < Minitest::Test
12
13
  $stdout = @old_stdout
13
14
  end
14
15
 
16
+ def test_all_lib_files_are_included_in_manifest
17
+ project_root = File.expand_path('../..', __FILE__)
18
+ manifest = File.readlines("#{project_root}/Manifest.txt").map(&:chomp)
19
+ lib_files = Dir["#{project_root}/lib/**/*.rb"].map { |path| path.sub("#{project_root}/", '') }
20
+ lib_files.each { |lib_file| assert_includes manifest, lib_file }
21
+ end
22
+
15
23
  def test_kwargs
16
24
  Benchmark.ips(:time => 1, :warmup => 1, :quiet => false) do |x|
17
25
  x.report("sleep 0.25") { sleep(0.25) }
@@ -53,6 +61,39 @@ class TestBenchmarkIPS < Minitest::Test
53
61
  end
54
62
 
55
63
  assert $stdout.string.size.zero?
64
+
65
+ Benchmark.ips do |x|
66
+ x.quiet = true
67
+ x.report("operation") { 100 * 100 }
68
+ end
69
+
70
+ assert $stdout.string.size.zero?
71
+ end
72
+
73
+ def test_quiet_option_override
74
+ Benchmark.ips(quiet: true) do |x|
75
+ x.quiet = false
76
+ x.report("operation") { 100 * 100 }
77
+ end
78
+
79
+ assert $stdout.string.size > 0
80
+ $stdout.truncate(0)
81
+
82
+ Benchmark.ips(quiet: true) do |x|
83
+ x.config(quiet: false)
84
+ x.report("operation") { 100 * 100 }
85
+ end
86
+
87
+ assert $stdout.string.size > 0
88
+ $stdout.truncate(0)
89
+
90
+ Benchmark.ips(quiet: true) do |x|
91
+ # Calling config should not make quiet option overridden when no specified
92
+ x.config({})
93
+ x.report("operation") { 100 * 100 }
94
+ end
95
+
96
+ assert $stdout.string.size.zero?
56
97
  end
57
98
 
58
99
  def test_ips
@@ -116,6 +157,21 @@ class TestBenchmarkIPS < Minitest::Test
116
157
  assert_equal [:warming, :warmup_stats, :running, :add_report], suite.calls
117
158
  end
118
159
 
160
+ def test_ips_config_suite_by_accsr
161
+ suite = Struct.new(:calls) do
162
+ def method_missing(method, *args)
163
+ calls << method
164
+ end
165
+ end.new([])
166
+
167
+ Benchmark.ips(0.1, 0.1) do |x|
168
+ x.suite = suite
169
+ x.report("job") {}
170
+ end
171
+
172
+ assert_equal [:warming, :warmup_stats, :running, :add_report], suite.calls
173
+ end
174
+
119
175
  def test_ips_defaults
120
176
  report = Benchmark.ips do |x|
121
177
  x.report("sleep 0.25") { sleep(0.25) }
@@ -182,4 +238,17 @@ class TestBenchmarkIPS < Minitest::Test
182
238
  assert data[0]["ips"]
183
239
  assert data[0]["stddev"]
184
240
  end
241
+
242
+ def test_hold!
243
+ temp_file_name = Dir::Tmpname.create(["benchmark-ips", ".tmp"]) { }
244
+
245
+ Benchmark.ips(:time => 0.001, :warmup => 0.001) do |x|
246
+ x.report("operation") { 100 * 100 }
247
+ x.report("operation2") { 100 * 100 }
248
+ x.hold! temp_file_name
249
+ end
250
+
251
+ assert File.exist?(temp_file_name)
252
+ File.unlink(temp_file_name)
253
+ end
185
254
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: benchmark-ips
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.3
4
+ version: 2.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Phoenix
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-28 00:00:00.000000000 Z
11
+ date: 2021-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -77,7 +77,9 @@ files:
77
77
  - lib/benchmark/ips.rb
78
78
  - lib/benchmark/ips/job.rb
79
79
  - lib/benchmark/ips/job/entry.rb
80
+ - lib/benchmark/ips/job/noop_report.rb
80
81
  - lib/benchmark/ips/job/stdout_report.rb
82
+ - lib/benchmark/ips/noop_suite.rb
81
83
  - lib/benchmark/ips/report.rb
82
84
  - lib/benchmark/ips/share.rb
83
85
  - lib/benchmark/ips/stats/bootstrap.rb
@@ -107,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
109
  - !ruby/object:Gem::Version
108
110
  version: '0'
109
111
  requirements: []
110
- rubygems_version: 3.1.2
112
+ rubygems_version: 3.1.4
111
113
  signing_key:
112
114
  specification_version: 4
113
115
  summary: An iterations per second enhancement to Benchmark.