benchmark-ips 2.1.1 → 2.2.0

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
  SHA1:
3
- metadata.gz: 8acfa69c132c3a56ee713ef09c4d2fb1882bf4ab
4
- data.tar.gz: 53529931e75cc105984b7a3b546450c7eb0a9f3f
3
+ metadata.gz: 10d2721496232fa66554efc54374e96a44bb8b46
4
+ data.tar.gz: 0eaef49055af4e91846cf61ccd8eafb4c2c779cc
5
5
  SHA512:
6
- metadata.gz: aaef11c1b2f020783fe2b3bc8e7884e3a58849dfa1adcf7b4f28365f07b4ba960acfcb8b44490c8e70479f8328e7a2ac5e39b4fcbe381c52943ad63ff1763115
7
- data.tar.gz: 2bfa31d9ea71e9af04a9aae4f72932c3de6a1b87ebaae97e0b0634740a00cdbfaf6fc796aac5793796877f4fb1bffe416cd7c065ac63558992b0e814fcc891c7
6
+ metadata.gz: 5a6eb4ecc46877f3b73836d2b1999b1ed895bc553a5a6baf2470ad3225343b44bc58574eaae6446f3ae658ec383ec7cf61059283df1d08d1cf1395ba64d9895f
7
+ data.tar.gz: ccf501ab18c3243bcafc36fc891d8d9cb1b083a317f9743ae6863cc0f956cde0c3f01cadd1ad73430a59a17d642acb6be0c25827ad12b398b0677f46b311e375
@@ -1,3 +1,27 @@
1
+ === 2.2.0 / 2015-05-09
2
+
3
+ * 1 minor features:
4
+ * Fix quiet mode
5
+ * Allow passing a custom suite via config
6
+ * Silent a job if a suite was passed and is quiet
7
+ * Export report to json file.
8
+ * Accept symbol as report's argument.
9
+
10
+ * 2 doc fixes:
11
+ * Squish duplicate `to` in README
12
+ * Update copyright to 2015. [ci skip]
13
+
14
+ * 9 PRs merged:
15
+ * Merge pull request #37 from splattael/patch-1
16
+ * Merge pull request #36 from kirs/quiet-mode
17
+ * Merge pull request #35 from JuanitoFatas/doc/suite
18
+ * Merge pull request #34 from splattael/config-suite
19
+ * Merge pull request #33 from splattael/suite-quiet
20
+ * Merge pull request #32 from O-I/remove-gemfile-lock
21
+ * Merge pull request #31 from JuanitoFatas/doc/bump-copyright-year
22
+ * Merge pull request #29 from JuanitoFatas/feature/json-export
23
+ * Merge pull request #26 from JuanitoFatas/feature/takes-symbol-as-report-parameter
24
+
1
25
  === 2.1.1 / 2015-01-12
2
26
 
3
27
  * 1 minor fix:
data/README.md CHANGED
@@ -93,6 +93,49 @@ One benefit to using this method is benchmark-ips automatically determines the
93
93
  data points for testing our code, so we can focus on the results instead of
94
94
  guessing iteration counts as we do with the traditional Benchmark library.
95
95
 
96
+ ### Custom Suite
97
+
98
+ Pass a custom suite to disable garbage collection during benchmark:
99
+
100
+ ```ruby
101
+ require 'benchmark/ips'
102
+
103
+ # Enable and start GC before each job run. Disable GC afterwards.
104
+ #
105
+ # Inspired by https://www.omniref.com/ruby/2.2.1/symbols/Benchmark/bm?#annotation=4095926&line=182
106
+ class GCSuite
107
+ def warming(*)
108
+ run_gc
109
+ end
110
+
111
+ def running(*)
112
+ run_gc
113
+ end
114
+
115
+ def warmup_stats(*)
116
+ end
117
+
118
+ def add_report(*)
119
+ end
120
+
121
+ private
122
+
123
+ def run_gc
124
+ GC.enable
125
+ GC.start
126
+ GC.disable
127
+ end
128
+ end
129
+
130
+ suite = GCSuite.new
131
+
132
+ Benchmark.ips do |x|
133
+ x.config(:suite => suite)
134
+ x.report("job1") { ... }
135
+ x.report("job2") { ... }
136
+ end
137
+ ```
138
+
96
139
  ## REQUIREMENTS:
97
140
 
98
141
  * None!
@@ -114,7 +157,7 @@ and generate the RDoc.
114
157
 
115
158
  (The MIT License)
116
159
 
117
- Copyright (c) 2012 Evan Phoenix
160
+ Copyright (c) 2015 Evan Phoenix
118
161
 
119
162
  Permission is hereby granted, free of charge, to any person obtaining
120
163
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -4,6 +4,7 @@ require 'rubygems'
4
4
  require 'hoe'
5
5
 
6
6
  Hoe.plugin :minitest
7
+ Hoe.plugin :git
7
8
 
8
9
  hoe = Hoe.spec 'benchmark-ips' do
9
10
  developer('Evan Phoenix', 'evan@phx.io')
@@ -11,7 +11,7 @@ module Benchmark
11
11
  module IPS
12
12
 
13
13
  # Benchmark-ips Gem version.
14
- VERSION = "2.1.1"
14
+ VERSION = "2.2.0"
15
15
 
16
16
  # CODENAME of current version.
17
17
  CODENAME = "Springtime Hummingbird Dance"
@@ -21,7 +21,7 @@ module Benchmark
21
21
  # @param time [Integer] Specify how long should benchmark your code in seconds.
22
22
  # @param warmup [Integer] Specify how long should Warmup time run in seconds.
23
23
  # @return [Report]
24
- def ips(time=nil, warmup=nil)
24
+ def ips(time=nil, warmup=nil, quiet=false)
25
25
  suite = nil
26
26
 
27
27
  sync, $stdout.sync = $stdout.sync, true
@@ -30,7 +30,7 @@ module Benchmark
30
30
  suite = Benchmark::Suite.current
31
31
  end
32
32
 
33
- quiet = suite && !suite.quiet?
33
+ quiet ||= (suite && suite.quiet?)
34
34
 
35
35
  job = Job.new({:suite => suite,
36
36
  :quiet => quiet
@@ -58,6 +58,10 @@ module Benchmark
58
58
  job.run_comparison
59
59
  end
60
60
 
61
+ if job.json?
62
+ job.generate_json
63
+ end
64
+
61
65
  return job.full_report
62
66
  end
63
67
 
@@ -13,11 +13,11 @@ module Benchmark
13
13
  # Entries in Benchmark Jobs.
14
14
  class Entry
15
15
  # Instantiate the Benchmark::IPS::Job::Entry.
16
- # @param label [String] Label of Benchmarked code.
16
+ # @param label [#to_s] Label of Benchmarked code.
17
17
  # @param action [String, Proc] Code to be benchmarked.
18
18
  # @raise [ArgumentError] Raises when action is not String or not responding to +call+.
19
19
  def initialize(label, action)
20
- @label = label
20
+ @label = label.to_s
21
21
 
22
22
  if action.kind_of? String
23
23
  compile action
@@ -126,6 +126,7 @@ module Benchmark
126
126
  @quiet = opts[:quiet] || false
127
127
  @list = []
128
128
  @compare = false
129
+ @json_path = false
129
130
 
130
131
  @timing = {}
131
132
  @full_report = Report.new
@@ -141,6 +142,7 @@ module Benchmark
141
142
  def config opts
142
143
  @warmup = opts[:warmup] if opts[:warmup]
143
144
  @time = opts[:time] if opts[:time]
145
+ @suite = opts[:suite] if opts[:suite]
144
146
  end
145
147
 
146
148
  # Return true if job needs to be compared.
@@ -154,6 +156,18 @@ module Benchmark
154
156
  @compare = true
155
157
  end
156
158
 
159
+
160
+ # Return true if job needs to generate json.
161
+ # @return [Boolean] Need to generate json?
162
+ def json?
163
+ !!@json_path
164
+ end
165
+
166
+ # Set @json_path to given path, defaults to "data.json".
167
+ def json!(path="data.json")
168
+ @json_path = path
169
+ end
170
+
157
171
  # Registers the given label and block pair in the job list.
158
172
  # @param label [String] Label of benchmarked code.
159
173
  # @param str [String] Code to be benchamrked.
@@ -302,6 +316,11 @@ module Benchmark
302
316
  @full_report.run_comparison
303
317
  end
304
318
 
319
+ # Generate json from +@full_report+.
320
+ def generate_json
321
+ @full_report.generate_json @json_path
322
+ end
323
+
305
324
  # Create report by add entry to +@full_report+.
306
325
  # @param item [Benchmark::IPS::Job::Entry] Report item.
307
326
  # @param measured_us [Integer] Measured time in microsecond.
@@ -10,14 +10,14 @@ module Benchmark
10
10
  # Represents benchmarking code data for Report.
11
11
  class Entry
12
12
  # Instantiate the Benchmark::IPS::Report::Entry.
13
- # @param [String] label Label of entry.
13
+ # @param [#to_s] label Label of entry.
14
14
  # @param [Integer] us Measured time in microsecond.
15
15
  # @param [Integer] iters Iterations.
16
16
  # @param [Float] ips Iterations per second.
17
17
  # @param [Float] ips_sd Standard deviation of iterations per second.
18
18
  # @param [Integer] cycles Number of Cycles.
19
19
  def initialize(label, us, iters, ips, ips_sd, cycles)
20
- @label = label
20
+ @label = label.to_s
21
21
  @microseconds = us
22
22
  @iterations = iters
23
23
  @ips = ips
@@ -124,6 +124,7 @@ module Benchmark
124
124
  # Instantiate the Report.
125
125
  def initialize
126
126
  @entries = []
127
+ @data = nil
127
128
  end
128
129
 
129
130
  # Add entry to report.
@@ -139,10 +140,35 @@ module Benchmark
139
140
  @entries.last
140
141
  end
141
142
 
143
+ # Entries data in array for generate json.
144
+ # Each entry is a hash, consists of:
145
+ # name: Entry#label
146
+ # ips: Entry#ips
147
+ # stddev: Entry#ips_sd
148
+ # @return [Array] Array of entries
149
+ def data
150
+ @data ||= @entries.collect do |entry|
151
+ {
152
+ name: entry.label,
153
+ ips: entry.ips,
154
+ stddev: entry.ips_sd
155
+ }
156
+ end
157
+ end
158
+
142
159
  # Run comparison of entries.
143
160
  def run_comparison
144
161
  Benchmark.compare(*@entries)
145
162
  end
163
+
164
+ # Generate json from Report#data to given path.
165
+ # @param path [String] path to generate json.
166
+ def generate_json(path)
167
+ File.open path, "w" do |f|
168
+ require "json"
169
+ f.write JSON.pretty_generate(data)
170
+ end
171
+ end
146
172
  end
147
173
  end
148
174
  end
@@ -12,6 +12,22 @@ class TestBenchmarkIPS < Minitest::Test
12
12
  $stdout = @old_stdout
13
13
  end
14
14
 
15
+ def test_output
16
+ Benchmark.ips(1) do |x|
17
+ x.report("operation") { 100 * 100 }
18
+ end
19
+
20
+ assert $stdout.string.size > 0
21
+ end
22
+
23
+ def test_quiet
24
+ Benchmark.ips(1, nil, true) do |x|
25
+ x.report("operation") { 100 * 100 }
26
+ end
27
+
28
+ assert $stdout.string.size.zero?
29
+ end
30
+
15
31
  def test_ips
16
32
  report = Benchmark.ips do |x|
17
33
  x.config(:time => 1, :warmup => 1)
@@ -58,6 +74,21 @@ class TestBenchmarkIPS < Minitest::Test
58
74
  assert_in_delta 4.0, rep.ips, 0.2
59
75
  end
60
76
 
77
+ def test_ips_config_suite
78
+ suite = Struct.new(:calls) do
79
+ def method_missing(method, *args)
80
+ calls << method
81
+ end
82
+ end.new([])
83
+
84
+ Benchmark.ips(0.1, 0.1) do |x|
85
+ x.config(:suite => suite)
86
+ x.report("job") {}
87
+ end
88
+
89
+ assert_equal [:warming, :warmup_stats, :running, :add_report], suite.calls
90
+ end
91
+
61
92
  def test_ips_defaults
62
93
  report = Benchmark.ips do |x|
63
94
  x.report("sleep 0.25") { sleep(0.25) }
@@ -69,4 +100,48 @@ class TestBenchmarkIPS < Minitest::Test
69
100
  assert_equal 4*5, rep.iterations
70
101
  assert_in_delta 4.0, rep.ips, 0.2
71
102
  end
103
+
104
+ def test_ips_report_using_symbol
105
+ report = Benchmark.ips do |x|
106
+ x.report(:sleep_a_quarter_second) { sleep(0.25) }
107
+ end
108
+
109
+ rep = report.entries.first
110
+
111
+ assert_equal "sleep_a_quarter_second", rep.label
112
+ assert_equal 4*5, rep.iterations
113
+ assert_in_delta 4.0, rep.ips, 0.2
114
+ end
115
+
116
+ def test_ips_default_data
117
+ report = Benchmark.ips do |x|
118
+ x.report("sleep 0.25") { sleep(0.25) }
119
+ end
120
+
121
+ all_data = report.data
122
+
123
+ assert all_data
124
+ assert_equal "sleep 0.25", all_data[0][:name]
125
+ assert all_data[0][:ips]
126
+ assert all_data[0][:stddev]
127
+ end
128
+
129
+ def test_json_output
130
+ json_file = Tempfile.new("data.json")
131
+
132
+ Benchmark.ips do |x|
133
+ x.report("sleep 0.25") { sleep(0.25) }
134
+ x.json! json_file.path
135
+ end
136
+
137
+ json_data = json_file.read
138
+ assert json_data
139
+
140
+ data = JSON.parse json_data
141
+ assert data
142
+ assert_equal 1, data.size
143
+ assert_equal "sleep 0.25", data[0]["name"]
144
+ assert data[0]["ips"]
145
+ assert data[0]["stddev"]
146
+ end
72
147
  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.1.1
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Phoenix
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-12 00:00:00.000000000 Z
11
+ date: 2015-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.4'
19
+ version: '5.5'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5.4'
26
+ version: '5.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rdoc
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -100,5 +100,4 @@ rubygems_version: 2.2.2
100
100
  signing_key:
101
101
  specification_version: 4
102
102
  summary: A iterations per second enhancement to Benchmark.
103
- test_files:
104
- - test/test_benchmark_ips.rb
103
+ test_files: []