benchmark_time 1.0.1 → 1.2.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 +7 -0
- data/.rspec +2 -0
- data/README.md +34 -11
- data/benchmark_time.gemspec +2 -1
- data/lib/benchmark_time/benchmark_time.rb +38 -20
- data/lib/benchmark_time/enumerable_statistics.rb +4 -4
- data/lib/benchmark_time/version.rb +1 -1
- data/sample/media_library_benchmark.rb +9 -0
- data/spec/benchmark_spec.rb +54 -0
- data/spec/spec_helper.rb +17 -0
- metadata +44 -17
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6e0dd882b3f3c6affd29552750cde584f613743a
|
4
|
+
data.tar.gz: 787352d18319099f0cc43bcab25ba6bda005f621
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4f7cf60d047bfbba6794e3e1c390354d0abea16a20fb8d0d7ee5cce762624b5124d614c1b16314f186e07bc1c85bcc065b78d5ef55cee426dd75b51a31a6dca5
|
7
|
+
data.tar.gz: 899d34d1995fe566cfd8716ea289ced015b8b699690b0e8485cb46562483b5819cf529b911377a6269bd0c5327008f035480e8a3e777b0841d3d25f8fa0eb34d
|
data/.rspec
ADDED
data/README.md
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
# BenchmarkTime
|
2
2
|
|
3
3
|
Benchmark the execution time of an arbitrary block of code. Specify concurrent
|
4
|
-
|
4
|
+
<<<<<<< HEAD
|
5
|
+
threads and number of execution loops for more robust sampling.
|
6
|
+
|
7
|
+
BenchmarkTime is especially built to benchmark things like external services,
|
8
|
+
rather than ruby code itself. It can do something like a small scale
|
9
|
+
load test of external dependencies and give you a benchmark with concurrency.
|
5
10
|
|
6
11
|
## Installation
|
7
12
|
|
@@ -18,9 +23,11 @@ Or install it yourself as:
|
|
18
23
|
$ gem install benchmark_time
|
19
24
|
|
20
25
|
## Usage
|
21
|
-
|
22
|
-
|
23
|
-
|
26
|
+
|
27
|
+
# Benchmarking rabbitmq with bunny:
|
28
|
+
|
29
|
+
require 'benchmark_time'
|
30
|
+
require 'bunny'
|
24
31
|
|
25
32
|
# Benchmark connecting and filing an item into rabbitmq with bunny
|
26
33
|
benchmark_time(num_threads: 10, num_loops: 5) do
|
@@ -33,20 +40,36 @@ Or install it yourself as:
|
|
33
40
|
end
|
34
41
|
|
35
42
|
->
|
36
|
-
|
43
|
+
"----------------------------------------"
|
44
|
+
|
45
|
+
"Samples: 20"
|
37
46
|
|
38
|
-
|
47
|
+
"Min time: 0.059449195861816406"
|
39
48
|
|
40
|
-
|
49
|
+
"Max time: 0.15325689315795898"
|
41
50
|
|
42
|
-
|
51
|
+
"Average time: 0.10354292392730713"
|
43
52
|
|
44
|
-
|
53
|
+
"Standard Deviation: 0.027390028761805192"
|
45
54
|
|
46
|
-
|
55
|
+
"----------------------------------------"
|
47
56
|
|
48
|
-
|
57
|
+
# Options for benchmark_time:
|
49
58
|
|
59
|
+
:work_warmup_proc A proc to call for each thread. this can pre-warm connections,
|
60
|
+
or perform oother non-timed work.
|
61
|
+
|
62
|
+
:num_threads Number of concurrent threads to execute the work
|
63
|
+
|
64
|
+
:num_loops Number of times to call the block in each execution thread.
|
65
|
+
|
66
|
+
:loop_delay Delay after each loop. (defaults to 0)
|
67
|
+
|
68
|
+
:show_values If printing output show actual variable values (good at small scale)
|
69
|
+
|
70
|
+
:print_results If true, puts the result to sdtout at the end.
|
71
|
+
|
72
|
+
:garbage_collection If false (default) garbage colleciton will be off during the loop to benchmark.
|
50
73
|
|
51
74
|
|
52
75
|
## Contributing
|
data/benchmark_time.gemspec
CHANGED
@@ -17,7 +17,8 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
|
-
|
20
|
+
spec.add_development_dependency "mocha"
|
21
|
+
spec.add_development_dependency "rspec"
|
21
22
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
23
|
spec.add_development_dependency "rake"
|
23
24
|
end
|
@@ -14,19 +14,32 @@ module BenchmarkTime
|
|
14
14
|
# Create and run a new benchmark with output to the command line
|
15
15
|
# ==== Options
|
16
16
|
# +:work_warmup_proc:+ A proc to call for each thread. this can pre-warm connections,
|
17
|
-
# or perform
|
18
|
-
# +:
|
19
|
-
# +:
|
17
|
+
# or perform oother non-timed work.
|
18
|
+
# +:num_threads+ Number of concurrent threads to execute the work
|
19
|
+
# +:num_loops+ Number of times to call the block in each execution thread.
|
20
|
+
# +:loop_delay Delay after each loop. (defaults to 0)
|
21
|
+
#
|
22
|
+
# +:show_values+ If output is printed, display array of actual variable values (good at small scale)
|
23
|
+
# +:print_results+ If true, puts the result to sdtout at the end.
|
24
|
+
# +:garbage_collection+ If false (default) garbage colleciton will be off during the loop to benchmark.
|
25
|
+
|
26
|
+
|
20
27
|
def initialize(options = {}, &work_block)
|
21
|
-
default_options = {num_threads:
|
28
|
+
default_options = { num_threads: 10,
|
29
|
+
num_loops: 10,
|
30
|
+
loop_delay: 0,
|
31
|
+
show_values: true,
|
32
|
+
print_results: true,
|
33
|
+
garbage_collection: false,
|
34
|
+
work_warmup_proc: nil,
|
35
|
+
}
|
36
|
+
|
22
37
|
options = default_options.merge(options)
|
23
|
-
|
24
|
-
options.to_instance_variables(binding, define: :attr_reader)
|
38
|
+
options.to_instance_variables(binding, define: :attr_reader)
|
25
39
|
@threads = []
|
26
40
|
@results = []
|
27
|
-
@results.extend(EnumerableStatistics)
|
28
41
|
@work_block = work_block
|
29
|
-
|
42
|
+
@results.extend(EnumerableStatistics)
|
30
43
|
end
|
31
44
|
|
32
45
|
# Returns a time for an arbitrary block's execution
|
@@ -38,32 +51,36 @@ module BenchmarkTime
|
|
38
51
|
|
39
52
|
# Prints benchmark results to stdout.
|
40
53
|
def display_results(result_array)
|
41
|
-
puts
|
42
|
-
puts "
|
43
|
-
puts "
|
44
|
-
puts "
|
45
|
-
puts "
|
46
|
-
puts "
|
47
|
-
puts "
|
54
|
+
puts "------------------- Completed run ----------------------------"
|
55
|
+
puts "Samples: #{result_array.length}"
|
56
|
+
puts "Min time: #{result_array.min}"
|
57
|
+
puts "Max time: #{result_array.max}"
|
58
|
+
puts "Average time: #{result_array.mean}"
|
59
|
+
puts "Standard Deviation: #{result_array.standard_deviation}"
|
60
|
+
puts "Values: #{result_array.inspect}" if @show_values
|
48
61
|
puts "--------------------------------------------------------------"
|
49
62
|
end
|
50
63
|
|
51
64
|
# Performs a multi-threaded execution of the block as specified in the initializer
|
52
65
|
def run
|
53
|
-
puts "Starting run with #{@num_threads} threads looping #{@num_loops} times"
|
66
|
+
puts "Starting run with #{@num_threads} threads looping #{@num_loops} times" if @print_results
|
54
67
|
@num_threads.times do
|
55
68
|
@threads << Thread.new do |th|
|
56
69
|
@num_loops.times do
|
57
70
|
@results << time_operation do
|
58
71
|
@work_warmup_proc.call if @work_warmup_proc
|
59
|
-
@work_block.call
|
72
|
+
result = @work_block.call
|
73
|
+
sleep @loop_delay
|
74
|
+
result
|
60
75
|
end
|
61
76
|
end
|
62
77
|
end
|
63
78
|
end
|
79
|
+
GC.disable unless @garbage_collection
|
64
80
|
@threads.each {|th| th.join }
|
65
|
-
|
66
|
-
display_results(@results)
|
81
|
+
GC.enable
|
82
|
+
display_results(@results) if @print_results
|
83
|
+
@results
|
67
84
|
end
|
68
85
|
|
69
86
|
end
|
@@ -72,5 +89,6 @@ end
|
|
72
89
|
|
73
90
|
# an easy wrapper to do the bem
|
74
91
|
def benchmark_time(*args, &block)
|
75
|
-
|
92
|
+
b = BenchmarkTime::BenchmarkTime.new(*args, &block)
|
93
|
+
b.run
|
76
94
|
end
|
@@ -6,17 +6,17 @@
|
|
6
6
|
module EnumerableStatistics
|
7
7
|
|
8
8
|
def sum
|
9
|
-
self.inject(0){|accum, i| accum + i }
|
9
|
+
self.inject(0) {|accum, i| accum + i }
|
10
10
|
end
|
11
11
|
|
12
12
|
def mean
|
13
|
-
self.sum/self.length.to_f
|
13
|
+
self.sum / self.length.to_f
|
14
14
|
end
|
15
15
|
|
16
16
|
def sample_variance
|
17
|
-
m
|
17
|
+
m = self.mean
|
18
18
|
sum = self.inject(0){|accum, i| accum +(i-m)**2 }
|
19
|
-
sum/(self.length - 1).to_f
|
19
|
+
sum / (self.length - 1).to_f
|
20
20
|
end
|
21
21
|
|
22
22
|
def standard_deviation
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative "spec_helper"
|
2
|
+
|
3
|
+
describe 'benchmark_time' do
|
4
|
+
|
5
|
+
it "should return an array with results" do
|
6
|
+
results = benchmark_time(num_threads: 1, num_loops: 2) { }
|
7
|
+
results.length.should == 2
|
8
|
+
results = benchmark_time(num_threads: 4, num_loops: 4) { }
|
9
|
+
results.length.should == 16
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return min/max/average" do
|
13
|
+
results = benchmark_time(num_threads: 1, num_loops: 2) { }
|
14
|
+
(results.min >= 0).should be_true
|
15
|
+
(results.max >= 0).should be_true
|
16
|
+
(results.mean >= 0).should be_true
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should print values if true" do
|
20
|
+
output = capture_stdout do
|
21
|
+
benchmark_time(num_threads: 1, num_loops: 1) {}
|
22
|
+
end
|
23
|
+
(output =~ /Values/).should be_true
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should print min/max/average if printing output" do
|
27
|
+
output = capture_stdout do
|
28
|
+
benchmark_time(num_threads: 1, num_loops: 2) {}
|
29
|
+
end
|
30
|
+
(output =~ /min time/i).should be_true
|
31
|
+
(output =~ /max time/i).should be_true
|
32
|
+
(output =~ /average time/i).should be_true
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should not print anything if printing output is disabled" do
|
36
|
+
output = capture_stdout do
|
37
|
+
benchmark_time(num_threads: 1, num_loops: 2, print_results: false) {}
|
38
|
+
end
|
39
|
+
output.empty?.should be_true
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should disable garbage collection if off" do
|
43
|
+
GC.expects(:disable).once.returns(true)
|
44
|
+
results = benchmark_time(num_threads: 2, num_loops: 1, garbage_collection: false) { }
|
45
|
+
GC.unstub(:disable)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should not disable garbage collection if off" do
|
49
|
+
GC.expects(:disable).never.returns(true)
|
50
|
+
results = benchmark_time(num_threads: 2, num_loops: 1, garbage_collection: true) { }
|
51
|
+
GC.unstub(:disable)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require "benchmark_time"
|
3
|
+
require 'mocha/api'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
def capture_stdout &block
|
10
|
+
old_stdout = $stdout
|
11
|
+
fake_stdout = StringIO.new
|
12
|
+
$stdout = fake_stdout
|
13
|
+
block.call
|
14
|
+
fake_stdout.string
|
15
|
+
ensure
|
16
|
+
$stdout = old_stdout
|
17
|
+
end
|
metadata
CHANGED
@@ -1,20 +1,46 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: benchmark_time
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- ebeland
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-03-16 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: mocha
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
14
41
|
- !ruby/object:Gem::Dependency
|
15
42
|
name: bundler
|
16
43
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
44
|
requirements:
|
19
45
|
- - ~>
|
20
46
|
- !ruby/object:Gem::Version
|
@@ -22,7 +48,6 @@ dependencies:
|
|
22
48
|
type: :development
|
23
49
|
prerelease: false
|
24
50
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
51
|
requirements:
|
27
52
|
- - ~>
|
28
53
|
- !ruby/object:Gem::Version
|
@@ -30,17 +55,15 @@ dependencies:
|
|
30
55
|
- !ruby/object:Gem::Dependency
|
31
56
|
name: rake
|
32
57
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
58
|
requirements:
|
35
|
-
- -
|
59
|
+
- - '>='
|
36
60
|
- !ruby/object:Gem::Version
|
37
61
|
version: '0'
|
38
62
|
type: :development
|
39
63
|
prerelease: false
|
40
64
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
65
|
requirements:
|
43
|
-
- -
|
66
|
+
- - '>='
|
44
67
|
- !ruby/object:Gem::Version
|
45
68
|
version: '0'
|
46
69
|
description: Quickly benchmark functionality from the command line
|
@@ -51,6 +74,7 @@ extensions: []
|
|
51
74
|
extra_rdoc_files: []
|
52
75
|
files:
|
53
76
|
- .gitignore
|
77
|
+
- .rspec
|
54
78
|
- Gemfile
|
55
79
|
- LICENSE.txt
|
56
80
|
- README.md
|
@@ -62,31 +86,34 @@ files:
|
|
62
86
|
- lib/benchmark_time/hash_extensions.rb
|
63
87
|
- lib/benchmark_time/time.rb
|
64
88
|
- lib/benchmark_time/version.rb
|
89
|
+
- sample/media_library_benchmark.rb
|
65
90
|
- sample/sample_benchmark.rb
|
91
|
+
- spec/benchmark_spec.rb
|
92
|
+
- spec/spec_helper.rb
|
66
93
|
homepage: http://github.com/ericbeland
|
67
94
|
licenses:
|
68
95
|
- MIT
|
96
|
+
metadata: {}
|
69
97
|
post_install_message:
|
70
98
|
rdoc_options: []
|
71
99
|
require_paths:
|
72
100
|
- lib
|
73
101
|
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
102
|
requirements:
|
76
|
-
- -
|
103
|
+
- - '>='
|
77
104
|
- !ruby/object:Gem::Version
|
78
105
|
version: '0'
|
79
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
-
none: false
|
81
107
|
requirements:
|
82
|
-
- -
|
108
|
+
- - '>='
|
83
109
|
- !ruby/object:Gem::Version
|
84
110
|
version: '0'
|
85
111
|
requirements: []
|
86
112
|
rubyforge_project:
|
87
|
-
rubygems_version:
|
113
|
+
rubygems_version: 2.2.1
|
88
114
|
signing_key:
|
89
|
-
specification_version:
|
115
|
+
specification_version: 4
|
90
116
|
summary: Run and benchmark a ruby block with min/max/avg
|
91
|
-
test_files:
|
92
|
-
|
117
|
+
test_files:
|
118
|
+
- spec/benchmark_spec.rb
|
119
|
+
- spec/spec_helper.rb
|