benchmark-plot 0.1 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/HISTORY.md +8 -1
- data/README.md +41 -1
- data/Rakefile +2 -0
- data/benchmark-plot.gemspec +2 -3
- data/examples/mapflat_vs_flat_map/benchmark_plot_graph.png +0 -0
- data/examples/mapflat_vs_flat_map/flat_vs_flat_map.rb +18 -4
- data/examples/matrix_vs_nmatrix/matrix_multiplication/matrix_multiplication.png +0 -0
- data/examples/matrix_vs_nmatrix/matrix_multiplication/matrix_multiplication.rb +19 -0
- data/examples/nmatrix_vs_narray/matrix_creation.rb +3 -0
- data/lib/benchmark/plot.rb +47 -0
- data/lib/benchmark/plot/plotter.rb +3 -1
- data/lib/benchmark/plot/version.rb +1 -1
- metadata +9 -10
- data/examples/flat_vs_flat_map.rb +0 -26
- data/examples/matrix_benchmarks.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad54756fcf89b2ae23e8f8993bb4738c37ce339d
|
4
|
+
data.tar.gz: ae95a1da2c424dc44c7c96b030bc90414a923966
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3594f791ad1d9267ba901febd3366a5be3d56274ee7c4f2b604a80f085891626db1df27fbfafcb02996638b056573132eb197d6b3f105fe7317200b899846b80
|
7
|
+
data.tar.gz: ef3d1b36344b03d0ce0bf5a85ab9e79f469298aee10f912b34b620c7290a20dc2ecd33f66bcd8be472a9e5ed646f09082d1ed1ca59b568c7bbc83ddc9a5703e6
|
data/.gitignore
CHANGED
data/HISTORY.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
1
|
# 0.1
|
2
2
|
|
3
|
-
* First gem release. Support for basic args and options.
|
3
|
+
* First gem release. Support for basic args and options.
|
4
|
+
|
5
|
+
# 0.1.1
|
6
|
+
|
7
|
+
* Remove uncalled for puts statement from plotter.rb.
|
8
|
+
* Add more examples.
|
9
|
+
* More options and default Y axis label of 'Seconds'.
|
10
|
+
* Lots of documentation.
|
data/README.md
CHANGED
@@ -1,6 +1,46 @@
|
|
1
1
|
# benchmark-plot
|
2
|
+
|
2
3
|
A Ruby benchmark extension to allow comparative plotting of benchmarks.
|
3
4
|
|
5
|
+
# Usage
|
6
|
+
|
7
|
+
This gem is mainly useful for benchmarking code over a number of inputs. This input should be supplied in the form of an object capable of calling `#each`.
|
8
|
+
|
9
|
+
Sample benchmarking script:
|
10
|
+
|
11
|
+
``` ruby
|
12
|
+
require 'benchmark/plot'
|
13
|
+
|
14
|
+
class TestArray
|
15
|
+
attr_reader :arr
|
16
|
+
|
17
|
+
def initialize arr
|
18
|
+
@arr = arr
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
@arr.size.to_s
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
test_data = [5, 25, 50, 75, 100, 125, 150, 175, 200,250,300]
|
27
|
+
test_data.map! {|e| TestArray.new(Array.new(e) {|i| i}) }
|
28
|
+
|
29
|
+
Benchmark.plot(test_data) do |x|
|
30
|
+
x.report("map.flatten") do |data|
|
31
|
+
data.arr.map { [nil] }.flatten
|
32
|
+
end
|
33
|
+
|
34
|
+
x.report("flat_map") do |data|
|
35
|
+
data.arr.flat_map { [nil] }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
Output:
|
41
|
+
|
42
|
+
![Benchmarks](examples/mapflat_vs_flat_map/benchmark_plot_graph.png)
|
43
|
+
|
4
44
|
# Acknowledgements
|
5
45
|
|
6
|
-
@tgxworld for providing the co-working space during the Open Source Breakfast Hack during Red Dot Ruby
|
46
|
+
[@tgxworld](https://github.com/tgxworld) for providing the co-working space during the Open Source Breakfast Hack during Red Dot Ruby Conference 2016 where this gem was built.
|
data/Rakefile
ADDED
data/benchmark-plot.gemspec
CHANGED
@@ -6,9 +6,8 @@ require 'benchmark/plot/version.rb'
|
|
6
6
|
Benchmark::Plot::DESCRIPTION = <<MSG
|
7
7
|
benchmark-plot is an extension to the Ruby standard benchmarking library.
|
8
8
|
|
9
|
-
It let's you easily create plots
|
10
|
-
|
11
|
-
benchmarking.
|
9
|
+
It let's you easily create plots of any code that you want to benchmark over
|
10
|
+
a varied number of inputs. It also supports comparative benchmarking.
|
12
11
|
MSG
|
13
12
|
|
14
13
|
Gem::Specification.new do |spec|
|
Binary file
|
@@ -1,12 +1,26 @@
|
|
1
|
+
require 'benchmark/plot'
|
2
|
+
|
3
|
+
class TestArray
|
4
|
+
attr_reader :arr
|
5
|
+
|
6
|
+
def initialize arr
|
7
|
+
@arr = arr
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
@arr.size.to_s
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
1
15
|
test_data = [5, 25, 50, 75, 100, 125, 150, 175, 200,250,300]
|
2
|
-
test_data.map! {|e| Array.new(e) {|i| i} }
|
16
|
+
test_data.map! {|e| TestArray.new(Array.new(e) {|i| i}) }
|
3
17
|
|
4
18
|
Benchmark.plot(test_data) do |x|
|
5
19
|
x.report("map.flatten") do |data|
|
6
|
-
data.map { [nil] }.flatten
|
20
|
+
data.arr.map { [nil] }.flatten
|
7
21
|
end
|
8
22
|
|
9
23
|
x.report("flat_map") do |data|
|
10
|
-
data.flat_map { [nil] }
|
24
|
+
data.arr.flat_map { [nil] }
|
11
25
|
end
|
12
|
-
end
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'benchmark/plot'
|
2
|
+
require 'matrix'
|
3
|
+
require 'nmatrix'
|
4
|
+
require 'nmatrix/atlas'
|
5
|
+
|
6
|
+
sizes = [5, 10, 50, 100, 150, 200]
|
7
|
+
|
8
|
+
Benchmark.plot sizes, title: "Matrix multiplication",
|
9
|
+
file_name: "matrix_multiplication" do |x|
|
10
|
+
x.report "NMatrix with ATLAS" do |size|
|
11
|
+
n = NMatrix.new([size,size], [1]*size*size, dtype: :float32)
|
12
|
+
n.dot(n)
|
13
|
+
end
|
14
|
+
|
15
|
+
x.report "Matrix" do |size|
|
16
|
+
n = Matrix[*[[1]*size]*size]
|
17
|
+
n * n
|
18
|
+
end
|
19
|
+
end
|
data/lib/benchmark/plot.rb
CHANGED
@@ -6,6 +6,53 @@ require 'benchmark/plot/report_maker'
|
|
6
6
|
require 'benchmark/plot/version'
|
7
7
|
|
8
8
|
module Benchmark
|
9
|
+
# Create a plot of the benchmarked code over a varied number of inputs.
|
10
|
+
#
|
11
|
+
# @param test_data [Enumerable] An object containing the data that is to be
|
12
|
+
# used for the benchmarking. This object must be Enumerable, i.e. it must
|
13
|
+
# have the `#each` method defined. Each of the constituent objects of
|
14
|
+
# `test_data` should have a `#to_s` method defined, which will be used for
|
15
|
+
# populating the X axis labels.
|
16
|
+
# @param [Hash] opts The options for configuring the graph.
|
17
|
+
# @option opts [Symbol, String] :title (:Benchmarks) Title of the graph.
|
18
|
+
# @option opts [Symbol, String] :file_name (:benchmark_plot_graph) Name of
|
19
|
+
# file to which plot is written.
|
20
|
+
# @option opts [Symbol] :time (:real) The kind of time that should be displayed
|
21
|
+
# on the graph. Can be `:real` for elapsed real time, `:stime` for System
|
22
|
+
# CPU time, `:utime` for User CPU time, `:cstime` for System CPU time of children,
|
23
|
+
# `:cutime` for User CPU time of children, and `:total` for the total time
|
24
|
+
# that is `:utime + :stime + :cutime + :cstime`.
|
25
|
+
# @option opts [TrueClass, FalseClass] :x_labels (true) Whether you want X-axis
|
26
|
+
# labels or not.
|
27
|
+
# @option opts [String, Symbol] :x_axis_label (nil) X-axis label string.
|
28
|
+
# @example Benchmark map{}.flatten vs. flat_map
|
29
|
+
# require 'benchmark/plot'
|
30
|
+
# class TestArray
|
31
|
+
# attr_reader :arr
|
32
|
+
#
|
33
|
+
# def initialize arr
|
34
|
+
# @arr = arr
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# # The to_s method is called for populating the X axis labels.
|
38
|
+
# def to_s
|
39
|
+
# @arr.size.to_s
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# test_data = [5, 25, 50, 75, 100, 125, 150, 175, 200,250,300]
|
44
|
+
# test_data.map! {|e| TestArray.new(Array.new(e) {|i| i}) }
|
45
|
+
#
|
46
|
+
# Benchmark.plot(test_data) do |x|
|
47
|
+
# x.report("map.flatten") do |data|
|
48
|
+
# # Here `data` will be of an object of type `TestArray`.
|
49
|
+
# data.arr.map { [nil] }.flatten
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# x.report("flat_map") do |data|
|
53
|
+
# data.arr.flat_map { [nil] }
|
54
|
+
# end
|
55
|
+
# end
|
9
56
|
def self.plot test_data, opts={}, &block
|
10
57
|
include Benchmark::Plot
|
11
58
|
|
@@ -7,6 +7,7 @@ module Benchmark
|
|
7
7
|
@title = opts[:title] || :Benchmarks
|
8
8
|
@time = opts[:time] || :real
|
9
9
|
@x_labels = opts[:x_labels] || true
|
10
|
+
@x_axis_label = opts[:x_axis_label]
|
10
11
|
@test_data = test_data
|
11
12
|
end
|
12
13
|
|
@@ -22,8 +23,9 @@ module Benchmark
|
|
22
23
|
plot.data label, time_data
|
23
24
|
end
|
24
25
|
positions = Array.new(@test_data.size) { |i| i }
|
25
|
-
puts positions.zip(@test_data.map(&:to_s)).to_h
|
26
26
|
plot.labels = positions.zip(@test_data.map(&:to_s)).to_h if @x_labels
|
27
|
+
plot.x_axis_label = @x_axis_label if @x_axis_label
|
28
|
+
plot.y_axis_label = 'Seconds'
|
27
29
|
plot.write("#{@file_name}.png")
|
28
30
|
end
|
29
31
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: benchmark-plot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sameer Deshmukh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gruff
|
@@ -24,12 +24,9 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
description:
|
28
|
-
|
29
|
-
|
30
|
-
It let's you easily create plots in the form of PNG images of any code that you
|
31
|
-
want to benchmark over a varied number of inputs. It also supports comparative
|
32
|
-
benchmarking.
|
27
|
+
description: "benchmark-plot is an extension to the Ruby standard benchmarking library.\n\nIt
|
28
|
+
let's you easily create plots of any code that you want to benchmark over \na varied
|
29
|
+
number of inputs. It also supports comparative benchmarking.\n"
|
33
30
|
email:
|
34
31
|
- sameer.deshmukh93@gmail.com
|
35
32
|
executables: []
|
@@ -40,11 +37,13 @@ files:
|
|
40
37
|
- HISTORY.md
|
41
38
|
- LICENSE
|
42
39
|
- README.md
|
40
|
+
- Rakefile
|
43
41
|
- benchmark-plot.gemspec
|
44
|
-
- examples/flat_vs_flat_map.rb
|
45
42
|
- examples/mapflat_vs_flat_map/benchmark_plot_graph.png
|
46
43
|
- examples/mapflat_vs_flat_map/flat_vs_flat_map.rb
|
47
|
-
- examples/
|
44
|
+
- examples/matrix_vs_nmatrix/matrix_multiplication/matrix_multiplication.png
|
45
|
+
- examples/matrix_vs_nmatrix/matrix_multiplication/matrix_multiplication.rb
|
46
|
+
- examples/nmatrix_vs_narray/matrix_creation.rb
|
48
47
|
- lib/benchmark/plot.rb
|
49
48
|
- lib/benchmark/plot/plotter.rb
|
50
49
|
- lib/benchmark/plot/report_maker.rb
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'benchmark/plot'
|
2
|
-
|
3
|
-
class TestArray
|
4
|
-
attr_reader :arr
|
5
|
-
|
6
|
-
def initialize arr
|
7
|
-
@arr = arr
|
8
|
-
end
|
9
|
-
|
10
|
-
def to_s
|
11
|
-
@arr.size.to_s
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
test_data = [5, 25, 50, 75, 100, 125, 150, 175, 200,250,300]
|
16
|
-
test_data.map! {|e| TestArray.new(Array.new(e) {|i| i}) }
|
17
|
-
|
18
|
-
Benchmark.plot(test_data) do |x|
|
19
|
-
x.report("map.flatten") do |data|
|
20
|
-
data.arr.map { [nil] }.flatten
|
21
|
-
end
|
22
|
-
|
23
|
-
x.report("flat_map") do |data|
|
24
|
-
data.arr.flat_map { [nil] }
|
25
|
-
end
|
26
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'nmatrix'
|
2
|
-
require 'matrix'
|
3
|
-
|
4
|
-
test_data = [5,10,15,20,25,30,35]
|
5
|
-
|
6
|
-
Benchmark.plot(test_data) do |x, data|
|
7
|
-
x.report("nmatrix creation") do
|
8
|
-
Array.new(data) { |i| i }
|
9
|
-
end
|
10
|
-
|
11
|
-
x.report("matrix creation") do
|
12
|
-
Array.new(data) { |i| i }
|
13
|
-
end
|
14
|
-
end
|