benchmark_driver 0.9.0 → 0.9.1

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
- SHA1:
3
- metadata.gz: 0cd5a98489bf28a8f6439e66e91350b20d330433
4
- data.tar.gz: bd97724eb0f7bb197bd2453b8eccb17e8fa5dcf2
2
+ SHA256:
3
+ metadata.gz: c1c86ab9c0e65de1f585af43bea8e331d9f1e4376e7f474ac06ffcb0550e282f
4
+ data.tar.gz: 1d644ecc22c43af0ae19c7d1c525fe1a12d45d56321803b2ba54e3f37c19311b
5
5
  SHA512:
6
- metadata.gz: 9debc903a940716911021dafe54dadd4be762259bb8c170c13266b6c15bd56f1762368d4a8982e75d326870b9611be65ba9fe30081a71c91874c489a516aa115
7
- data.tar.gz: 72dbf0e5038f7218311364bf5226c4b909a40bb4ab343ccb393a2e76a14c8fe8db4d4f986203fcf6d16a0147afcdd1cf0b8456c19be511b31e49dfbb1b699112
6
+ metadata.gz: b0e1d5d9f65635161f9694feb3ad685d6006bf8fc83f68ef3133be18bbfe908e08c5f9fbf9546d1775a8be3016b709e4a24eecdc9d4b66cbb879b2d3f7273e94
7
+ data.tar.gz: 654e5d9a00e5547dfb1e4d110f1147440c829b0af58b995228b237b87bcec309d59cea7cfef94332c430956b2a757bf744c156a167aa3a593b414f733275c7f7
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # v0.9.1
2
+
3
+ - Fix memory runner bug that actually doesn't run the benchmarked script
4
+ - Add once runner to test benchmark script in a short time
5
+
1
6
  # v0.9.0
2
7
 
3
8
  - The concept of runner is renewed
data/exe/benchmark-driver CHANGED
@@ -12,7 +12,7 @@ config = BenchmarkDriver::Config.new.tap do |c|
12
12
  bundler = false
13
13
  parser = OptionParser.new do |o|
14
14
  o.banner = "Usage: #{File.basename($0, '.*')} [options] [YAML]"
15
- o.on('-r', '--runner [TYPE]', 'Specify runner type: ips, time, memory (default: ips)') do |d|
15
+ o.on('-r', '--runner [TYPE]', 'Specify runner type: ips, time, memory, once (default: ips)') do |d|
16
16
  abort '-r, --runner must take argument but not given' if d.nil?
17
17
  c.runner_type = d
18
18
  end
@@ -110,6 +110,8 @@ class BenchmarkDriver::Output::Compare
110
110
  end
111
111
 
112
112
  scale = (Math.log10(value) / 3).to_i
113
+ return "%#{width}s" % value.to_s if scale < 0 # like 1.23e-04
114
+
113
115
  prefix = "%#{width}.3f" % (value.to_f / (1000 ** scale))
114
116
  suffix =
115
117
  case scale
@@ -2,6 +2,7 @@ module BenchmarkDriver
2
2
  module Runner
3
3
  require 'benchmark_driver/runner/ips'
4
4
  require 'benchmark_driver/runner/memory'
5
+ require 'benchmark_driver/runner/once'
5
6
  require 'benchmark_driver/runner/time'
6
7
  end
7
8
 
@@ -5,6 +5,7 @@ require 'benchmark_driver/default_job_parser'
5
5
  require 'tempfile'
6
6
  require 'shellwords'
7
7
 
8
+ # Show iteration per second.
8
9
  class BenchmarkDriver::Runner::Ips
9
10
  # JobParser returns this, `BenchmarkDriver::Runner.runner_for` searches "*::Job"
10
11
  Job = Class.new(BenchmarkDriver::DefaultJob)
@@ -72,10 +72,8 @@ class BenchmarkDriver::Runner::Memory
72
72
  loop_count: job.loop_count,
73
73
  )
74
74
 
75
- output = Tempfile.open(['benchmark_driver-', '.rb']) do |f|
76
- with_script(benchmark.render(result: f.path)) do |path|
77
- execute('/usr/bin/time', *exec.command, path)
78
- end
75
+ output = with_script(benchmark.render) do |path|
76
+ execute('/usr/bin/time', *exec.command, path)
79
77
  end
80
78
 
81
79
  match_data = /^(?<user>\d+.\d+)user\s+(?<system>\d+.\d+)system\s+(?<elapsed1>\d+):(?<elapsed2>\d+.\d+)elapsed.+\([^\s]+\s+(?<maxresident>\d+)maxresident\)k$/.match(output)
@@ -108,11 +106,10 @@ class BenchmarkDriver::Runner::Memory
108
106
  # @param [String] teardown
109
107
  # @param [Integer] loop_count
110
108
  BenchmarkScript = ::BenchmarkDriver::Struct.new(:prelude, :script, :teardown, :loop_count) do
111
- # @param [String] result - A file to write result
112
- def render(result:)
109
+ def render
113
110
  <<-RUBY
114
111
  #{prelude}
115
- #{while_loop('', loop_count)}
112
+ #{while_loop(script, loop_count)}
116
113
  #{teardown}
117
114
  RUBY
118
115
  end
@@ -0,0 +1,104 @@
1
+ require 'benchmark_driver/struct'
2
+ require 'benchmark_driver/metrics'
3
+ require 'benchmark_driver/default_job'
4
+ require 'benchmark_driver/default_job_parser'
5
+ require 'tempfile'
6
+ require 'shellwords'
7
+
8
+ # Run only once, for testing
9
+ class BenchmarkDriver::Runner::Once
10
+ # JobParser returns this, `BenchmarkDriver::Runner.runner_for` searches "*::Job"
11
+ Job = Class.new(BenchmarkDriver::DefaultJob)
12
+ # Dynamically fetched and used by `BenchmarkDriver::JobParser.parse`
13
+ JobParser = BenchmarkDriver::DefaultJobParser.for(Job)
14
+ # Passed to `output` by `BenchmarkDriver::Runner.run`
15
+ MetricsType = BenchmarkDriver::Metrics::Type.new(unit: 'i/s')
16
+
17
+ # @param [BenchmarkDriver::Config::RunnerConfig] config
18
+ # @param [BenchmarkDriver::Output::*] output
19
+ def initialize(config:, output:)
20
+ @config = config
21
+ @output = output
22
+ end
23
+
24
+ # This method is dynamically called by `BenchmarkDriver::JobRunner.run`
25
+ # @param [Array<BenchmarkDriver::Default::Job>] jobs
26
+ def run(jobs)
27
+ jobs = jobs.map do |job|
28
+ Job.new(job.to_h.merge(loop_count: 1)) # to show this on output
29
+ end
30
+
31
+ @output.with_benchmark do
32
+ jobs.each do |job|
33
+ @output.with_job(job) do
34
+ @config.executables.each do |exec|
35
+ metrics = run_benchmark(job, exec: exec) # no repeat support
36
+ @output.report(metrics)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ # @param [BenchmarkDriver::Runner::Ips::Job] job - loop_count is not nil
46
+ # @param [BenchmarkDriver::Config::Executable] exec
47
+ # @return [BenchmarkDriver::Metrics]
48
+ def run_benchmark(job, exec:)
49
+ benchmark = BenchmarkScript.new(
50
+ prelude: job.prelude,
51
+ script: job.script,
52
+ teardown: job.teardown,
53
+ loop_count: job.loop_count,
54
+ )
55
+
56
+ duration = Tempfile.open(['benchmark_driver-', '.rb']) do |f|
57
+ with_script(benchmark.render(result: f.path)) do |path|
58
+ execute(*exec.command, path)
59
+ end
60
+ Float(f.read)
61
+ end
62
+
63
+ BenchmarkDriver::Metrics.new(
64
+ value: 1.0 / duration,
65
+ duration: duration,
66
+ executable: exec,
67
+ )
68
+ end
69
+
70
+ def with_script(script)
71
+ Tempfile.open(['benchmark_driver-', '.rb']) do |f|
72
+ f.puts script
73
+ f.close
74
+ return yield(f.path)
75
+ end
76
+ end
77
+
78
+ def execute(*args)
79
+ output = IO.popen(args, err: [:child, :out], &:read) # handle stdout?
80
+ unless $?.success?
81
+ raise "Failed to execute: #{args.shelljoin} (status: #{$?.exitstatus})"
82
+ end
83
+ output
84
+ end
85
+
86
+ # @param [String] prelude
87
+ # @param [String] script
88
+ # @param [String] teardown
89
+ # @param [Integer] loop_count
90
+ BenchmarkScript = ::BenchmarkDriver::Struct.new(:prelude, :script, :teardown, :loop_count) do
91
+ # @param [String] result - A file to write result
92
+ def render(result:)
93
+ <<-RUBY
94
+ #{prelude}
95
+ __bmdv_before = Time.now
96
+ #{script}
97
+ __bmdv_after = Time.now
98
+ File.write(#{result.dump}, (__bmdv_after - __bmdv_before).inspect)
99
+ #{teardown}
100
+ RUBY
101
+ end
102
+ end
103
+ private_constant :BenchmarkScript
104
+ end
@@ -1,3 +1,3 @@
1
1
  module BenchmarkDriver
2
- VERSION = '0.9.0'
2
+ VERSION = '0.9.1'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: benchmark_driver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
@@ -83,6 +83,7 @@ files:
83
83
  - lib/benchmark_driver/runner.rb
84
84
  - lib/benchmark_driver/runner/ips.rb
85
85
  - lib/benchmark_driver/runner/memory.rb
86
+ - lib/benchmark_driver/runner/once.rb
86
87
  - lib/benchmark_driver/runner/time.rb
87
88
  - lib/benchmark_driver/struct.rb
88
89
  - lib/benchmark_driver/version.rb
@@ -106,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
107
  version: '0'
107
108
  requirements: []
108
109
  rubyforge_project:
109
- rubygems_version: 2.6.13
110
+ rubygems_version: 2.7.3
110
111
  signing_key:
111
112
  specification_version: 4
112
113
  summary: Fully-featured accurate benchmark driver for Ruby