benchmark_driver 0.14.22 → 0.15.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
  SHA256:
3
- metadata.gz: 12ed79eb718a91c50643a0a4880810ffc2dd41e6fa2ee0553e24c631499cd262
4
- data.tar.gz: 31a10ecb698c7911263db83ebe40ff27cfe790d768d2eacf454c60c2d0746408
3
+ metadata.gz: ccc06a22a6f3a22dd745264633e05acabc91a4696625f9e7958532e7de728f63
4
+ data.tar.gz: 8ba559f9a31adc785a65ae018aa4f552469570b08f3c679bc69e17429a1e50a4
5
5
  SHA512:
6
- metadata.gz: 003d82d144d2cf0186af2ad9a548bdfe03a92bd2ea6765a6a1fc7258af1171ec6a2021a7a3f4c5d7c756c423dd653e973b3c02c9df63fe806016437c0c4fb53a
7
- data.tar.gz: 15d64cb465a9e0830036a9f8998100a61d3822dde7353c40e54da7dd9c3ae898aba56d6f1fa340f5b9a40e5ff6b7e1f4267147af5ca1beaa57ecafb63ab468c8
6
+ metadata.gz: 04dcd4ad580bc8980c33469c2a3df0301c1fc272d8612246c02b095cfe37f46db13f787b678beafe3144869622c83ad91403036419e25b525aaa3e756d7f75c0
7
+ data.tar.gz: 43f9701dd9c6100fe9ec317f443bb09ab4410113b0b14acc1417ae0b748cd6b8abe9c2d26fedd4f365d2f67419c54311d774a4c6be4b37707d98861f7295ef19
@@ -1,3 +1,12 @@
1
+ # v0.15.0
2
+
3
+ - Introduce output plugin interface to accept arbitrary `--output-xxx` option
4
+ - Hide `--rbenv` option when `rbenv` command is not available
5
+
6
+ # v0.14.22
7
+
8
+ - Fix warnings for keyword arguments in Ruby 2.7
9
+
1
10
  # v0.14.21
2
11
 
3
12
  - Avoid crashinig on a zero division error in `compare` output
@@ -20,6 +20,19 @@ config = BenchmarkDriver::Config.new.tap do |c|
20
20
  end
21
21
  o.on('-o', '--output TYPE', String, 'Specify output type: compare, simple, markdown, record (default: compare)') do |out|
22
22
  c.output_type = out
23
+ begin
24
+ plugin_options = BenchmarkDriver::Output.get(out).const_get('OPTIONS', false)
25
+ rescue ArgumentError, LoadError, NameError
26
+ else
27
+ plugin_options.each do |name, args|
28
+ unless args.first.start_with?('--output-')
29
+ raise ArgumentError.new("#{args.first.dump} must start with '--output-'")
30
+ end
31
+ o.on(*args) do |opt|
32
+ c.output_opts[name] = opt
33
+ end
34
+ end
35
+ end
23
36
  end
24
37
  o.on('-e', '--executables EXECS', String, 'Ruby executables (e1::path1 arg1; e2::path2 arg2;...)') do |e|
25
38
  e.split(';').each do |name_path|
@@ -34,7 +47,7 @@ config = BenchmarkDriver::Config.new.tap do |c|
34
47
  r.split(';').each do |version|
35
48
  executables << BenchmarkDriver::Rbenv.parse_spec(version)
36
49
  end
37
- end
50
+ end if system('which rbenv > /dev/null')
38
51
  o.on('--repeat-count NUM', Integer, 'Try benchmark NUM times and use the fastest result or the worst memory usage') do |v|
39
52
  c.repeat_count = v
40
53
  end
@@ -6,6 +6,7 @@ module BenchmarkDriver
6
6
  Config = ::BenchmarkDriver::Struct.new(
7
7
  :runner_type, # @param [String]
8
8
  :output_type, # @param [String]
9
+ :output_opts, # @param [Hash{ Symbol => Object }]
9
10
  :paths, # @param [Array<String>]
10
11
  :executables, # @param [Array<BenchmarkDriver::Config::Executable>]
11
12
  :filters, # @param [Array<Regexp>]
@@ -17,6 +18,7 @@ module BenchmarkDriver
17
18
  defaults: {
18
19
  runner_type: 'ips',
19
20
  output_type: 'compare',
21
+ output_opts: {},
20
22
  filters: [],
21
23
  repeat_count: 1,
22
24
  repeat_result: 'best',
@@ -20,6 +20,17 @@ module BenchmarkDriver
20
20
  require 'benchmark_driver/output/record'
21
21
  require 'benchmark_driver/output/simple'
22
22
 
23
+ # @param [String] type
24
+ def self.get(type)
25
+ if type.include?(':')
26
+ raise ArgumentError.new("Output type '#{type}' cannot contain ':'")
27
+ end
28
+
29
+ require "benchmark_driver/output/#{type}" # for plugin
30
+ camelized = type.split('_').map(&:capitalize).join
31
+ ::BenchmarkDriver::Output.const_get(camelized, false)
32
+ end
33
+
23
34
  # BenchmarkDriver::Output is pluggable.
24
35
  # Create `BenchmarkDriver::Output::Foo` as benchmark_dirver-output-foo.gem and specify `-o foo`.
25
36
  #
@@ -27,18 +38,24 @@ module BenchmarkDriver
27
38
  # @param [Array<BenchmarkDriver::Metric>] metrics
28
39
  # @param [Array<BenchmarkDriver::Job>] jobs
29
40
  # @param [Array<BenchmarkDriver::Context>] contexts
30
- def initialize(type:, metrics:, jobs:, contexts:)
31
- if type.include?(':')
32
- raise ArgumentError.new("Output type '#{type}' cannot contain ':'")
33
- end
41
+ # @param [Hash{ Symbol => Object }] options
42
+ def initialize(type:, metrics:, jobs:, contexts:, options:)
43
+ output = ::BenchmarkDriver::Output.get(type)
44
+ output_params = output.instance_method(:initialize).parameters.select do |type, _name|
45
+ type == :keyreq || type == :key
46
+ end.map(&:last)
34
47
 
35
- require "benchmark_driver/output/#{type}" # for plugin
36
- camelized = type.split('_').map(&:capitalize).join
48
+ # Optionally pass `options` to #initialize
49
+ kwargs = {}
50
+ if output_params.include?(:options)
51
+ kwargs[:options] = options
52
+ end
37
53
 
38
- @output = ::BenchmarkDriver::Output.const_get(camelized, false).new(
54
+ @output = output.new(
39
55
  metrics: metrics,
40
56
  jobs: jobs,
41
57
  contexts: contexts,
58
+ **kwargs,
42
59
  )
43
60
  end
44
61
 
@@ -2,14 +2,19 @@ class BenchmarkDriver::Output::All
2
2
  NAME_LENGTH = 20
3
3
  CONTEXT_LENGTH = 20
4
4
 
5
+ OPTIONS = {
6
+ sort: ['--output-sort true|false', TrueClass, 'Sort all output or not (default: true)'],
7
+ }
8
+
5
9
  # @param [Array<BenchmarkDriver::Metric>] metrics
6
10
  # @param [Array<BenchmarkDriver::Job>] jobs
7
11
  # @param [Array<BenchmarkDriver::Context>] contexts
8
- def initialize(metrics:, jobs:, contexts:)
12
+ def initialize(metrics:, jobs:, contexts:, options:)
9
13
  @metrics = metrics
10
14
  @job_names = jobs.map(&:name)
11
15
  @context_names = contexts.map(&:name)
12
16
  @name_length = [@job_names.map(&:length).max, NAME_LENGTH].max
17
+ @sort = options.fetch(:sort, true)
13
18
  end
14
19
 
15
20
  def with_warmup(&block)
@@ -67,7 +72,10 @@ class BenchmarkDriver::Output::All
67
72
  else
68
73
  print("\e[#{num_values}F")
69
74
  end
70
- @context_values[@context] = result.all_values.values.first.sort
75
+ @context_values[@context] = result.all_values.values.first
76
+ if @sort
77
+ @context_values[@context] = @context_values[@context].sort
78
+ end
71
79
 
72
80
  precision = result.values.values.first.to_s.sub(/\A\d+\./, '').length
73
81
  num_values.times do |i|
@@ -36,6 +36,7 @@ module BenchmarkDriver
36
36
  metrics: metrics,
37
37
  jobs: klass_jobs.map { |job| BenchmarkDriver::Job.new(name: job.name) },
38
38
  contexts: contexts,
39
+ options: config.output_opts,
39
40
  )
40
41
  with_clean_env do
41
42
  runner.new(config: runner_config, output: output, contexts: contexts).run(klass_jobs)
@@ -1,3 +1,3 @@
1
1
  module BenchmarkDriver
2
- VERSION = '0.14.22'
2
+ VERSION = '0.15.0'
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.14.22
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-01 00:00:00.000000000 Z
11
+ date: 2019-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -144,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
146
  requirements: []
147
- rubygems_version: 3.0.6
147
+ rubygems_version: 3.0.3
148
148
  signing_key:
149
149
  specification_version: 4
150
150
  summary: Fully-featured accurate benchmark driver for Ruby