benchpress 0.0.1 → 1.0.0

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
2
  SHA1:
3
- metadata.gz: 9528aae3490907cc35b0cdf0ea6386495b6b422e
4
- data.tar.gz: 9996fddc495f27ef2e07465899324104a6fd9296
3
+ metadata.gz: 38edc94e8271789d69bf667ddd3b7ee3f50694c4
4
+ data.tar.gz: 5c5814779e8c63a1c664216033945d21c2e914ed
5
5
  SHA512:
6
- metadata.gz: f889f17220a46a3ce1bf4affd855984335f7ac5337fb012254468eee0331bbc2d25bf45bb1356af1f976f2bfe61bed7c03caa3dfee745cb1c5cf533e4802d9de
7
- data.tar.gz: f9b4ba4793df4fb12d4b26ccc4e1bf5f9bc174e1b67a37a0dc8f510e1063b276e34db3e27646fdb5516f3c034d3705090c8c35a226af3d561b3407b42a51d842
6
+ metadata.gz: 166dd6357b3d57e2a803ae4c348d9482fd10e18f329da92ef025e5f14bfbd75ed0a6576903b6a053a9d8028d0b08fe0bea243bdb480379b3ce1f1081e78d90b8
7
+ data.tar.gz: 55c0ea8a9f44679627c9c8636dfb89fd7cd680fd57f662fc3848688372ba45e9e8efadd39b0566a0e10291be3b300aad70f90337a629e2c447e851377fd5d4d7
data/README.md CHANGED
@@ -1,10 +1,36 @@
1
1
  Benchpress
2
2
  ==========
3
3
 
4
- Pit a few ruby methods against eachother, and chart it for great glory
5
-
6
- Fair warning, this is super alpha one hour quick hack type material here. I intend to make it prettier later among other things, but I find it at least partially useful at this stage.
4
+ Pit a few ruby methods against eachother, and chart it for great glory.
7
5
 
8
6
  Props to the folks at Gruff (https://github.com/topfunky/gruff) for making this simpler to do, and to the Ruby team behind Benchmark.
9
7
 
10
- ![ruby type benchmark](http://i40.tinypic.com/a9oemx.png "Benchmark of Ruby Types")
8
+ ## How to Benchpress
9
+
10
+ We're going to need to define a chart.
11
+
12
+ ```ruby
13
+ c = Benchpress::Chart.new(
14
+ entities: {
15
+ string: -> { 'string' },
16
+ symbol: -> { :symbol }
17
+ },
18
+ min: 10_000, # Minimum times to run. Default: 0
19
+ max: 100_000, # Maximum times to run. Default: 1_000
20
+ step: 10_000, # Step rate for next benchmark. Default: 1
21
+ name: 'string_vs_symbol', # File name. Default: 'Time.now.strftime '%Y-%m-%d-%H:%M:%S''
22
+ format: 'png' # File format. Default: png
23
+ )
24
+ ```
25
+
26
+ and then render it:
27
+ ```ruby
28
+ c.render # Line chart
29
+
30
+ c.render :line # Line chart
31
+ c.render :bar # Bar chart
32
+ ```
33
+
34
+ ![](new pic url)
35
+
36
+ Voila! Instant chart with realtime benchmarks to demonstrate complexities of methods everywhere! Supports an arbitrary number of entities.
data/RELEASE.md ADDED
@@ -0,0 +1,17 @@
1
+ # v0.0.1
2
+
3
+ Initial release
4
+
5
+ # v1.0.0
6
+
7
+ ## Bug Fixes
8
+
9
+ * Data points accumulating between runs on same entities
10
+
11
+ ## Changes
12
+
13
+ * Entities are no longer directly instantiated
14
+ * Entities are passed as a hash, in which the keys are the entities name, and the values are methods.
15
+ * Increase in rendering options
16
+ * Can now render bar charts.
17
+ * More efficient stepping algorithm, decreases runtime.
data/benchpress.gemspec CHANGED
@@ -9,9 +9,9 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Brandon Weaver"]
10
10
  spec.email = ["keystonelemur@gmail.com"]
11
11
  spec.description = %q{Pit Ruby methods against eachother in benchmark, and chart for great glory}
12
- spec.summary = %q{Ruby Benchmark + Gruff to auto-gen charts}
12
+ spec.summary = %q{Ruby Benchmark + Gruff to auto-gen charts for method profiline}
13
13
  spec.homepage = "https://github.com/baweaver/Benchpress"
14
- spec.license = "BSD"
14
+ spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -20,5 +20,5 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
- spec.add_development_dependency "gruff"
23
+ spec.add_runtime_dependency "gruff"
24
24
  end
@@ -1,47 +1,90 @@
1
+ require 'pry'
2
+
1
3
  module Benchpress
2
4
  class Chart
3
- # step - increment
4
- # min - minimum # of profiles to run
5
- # max - maximum # of profiles to run
5
+
6
+ # format - format of the file
7
+ # max - maximum # of profiles to run
8
+ # min - minimum # of profiles to run
9
+ # name - name of the file
10
+ # step - increment rate
11
+ # theme - theme of the chart
6
12
  # entities - data methods to run against
7
13
  def initialize(opts = {})
8
- @step = opts[:step] || 1
9
- @min = opts[:min] || 0
10
- @max = opts[:max] || 1000
11
- @entities = opts[:entities]
12
- @name = opts[:name] || "#{Time.now.strftime '%Y-%m-%d-%H:%M:%S'}"
13
- @format = opts[:format] || 'png'
14
- @theme = opts[:theme] || Gruff::Themes::THIRTYSEVEN_SIGNALS
14
+ @format = opts[:format] || 'png'
15
+ @max = opts[:max] || 1000
16
+ @min = opts[:min] || 0
17
+ @name = opts[:name] || "#{Time.now.strftime '%Y-%m-%d-%H:%M:%S'}"
18
+ @step = opts[:step] || 1
19
+ @theme = opts[:theme] || Gruff::Themes::THIRTYSEVEN_SIGNALS
20
+ @entities = parse_entities opts[:entities]
21
+ end
22
+
23
+ # Lets you parse in entities by passing a hash in.
24
+ #
25
+ # Benchpress::Chart.new(
26
+ # entities: {
27
+ # string: -> { 'string' }
28
+ # symbol: -> { :symbol }
29
+ # }
30
+ # )
31
+ def parse_entities(entities)
32
+ raise 'Must have entities' unless entities
33
+ @entities = entities.each_pair.reduce([]) { |ary, (name, method)| ary << Entity.new(name => method) }
15
34
  end
16
35
 
36
+ # file_name.ext
17
37
  def image_name
18
38
  @name + '.' + @format
19
39
  end
20
40
 
41
+ # Calculates Step Points
42
+ #
43
+ # (min / step) will render 0 unless min is greater than the step rate, giving the floor of the range
44
+ # (max / step) will render the maximum amount of times step will fit in the max wholly
45
+ #
46
+ # Caveat - If the max % step != 0, it will not render to the max. This is intended behavior.
21
47
  def step_points
22
- @step_points ||= (@min..@max).select { |i| i % @step == 0 }
48
+ raise 'Cannot have larger step than max' if @step > @max
49
+ @step_points ||= ((@min / @step)..(@max / @step)).reduce([]) { |steps, i| steps << @step * i }
23
50
  end
24
51
 
25
- def calculate_data_points
26
- @entities.each do |entity|
27
- step_points.each do |n|
28
- entity.data_points << Benchmark.measure { n.times { entity.method.call } }.real
29
- end
30
- end
52
+ # Only grab labels for every other run, so as to space them out a bit more.
53
+ def even_labels
54
+ step_points.each_with_index.reduce({}) { |hash, (val, i)| i.odd? ? hash : hash.merge!({ i => val.to_s }) }
31
55
  end
32
56
 
33
- def render
34
- calculate_data_points
57
+ # Get labels for every point
58
+ def all_labels
59
+ step_points.each_with_index.reduce({}) { |hash, (val, index)| hash.merge!({ index => val.to_s }) }
60
+ end
35
61
 
36
- Gruff::Line.new.tap { |g|
37
- g.labels = step_points.each_with_index.reduce({}) { |hash, (val, index)|
38
- index.odd? ? hash : hash.merge!({ index => val.to_s })
39
- }
62
+ # Render the entities data for the chart
63
+ def calculate_method_data_points
64
+ @entities.each { |entity| entity.render_data(step_points) }
65
+ end
66
+
67
+ # Render dispatcher. Note to refactor a tinge later.
68
+ def render(type = :line)
69
+ calculate_method_data_points
70
+
71
+ create_chart_data_for(
72
+ case type
73
+ when :line then Gruff::Line.new
74
+ when :bar then Gruff::Bar.new
75
+ end
76
+ ).write image_name
77
+ end
78
+
79
+ def create_chart_data_for(chart)
80
+ chart.tap { |g|
81
+ g.labels = all_labels
40
82
  g.theme = @theme
41
- @entities.each { |entity| g.data entity.name.to_sym, entity.data_points }
42
- g.x_axis_label = 'Times (n)'
83
+ g.x_axis_label = 'Times Run (n)'
43
84
  g.y_axis_label = 'Length (seconds)'
44
- }.write image_name
85
+
86
+ @entities.each { |entity| g.data *entity.data }
87
+ }
45
88
  end
46
89
  end
47
90
  end
@@ -3,12 +3,25 @@ module Benchpress
3
3
  attr_reader :method, :name
4
4
  attr_accessor :data_points
5
5
 
6
- # color - line color
7
- # method - what are we benchmarking?
6
+ # Pass in the name of the entity as a symbol, and its method as a lambda
7
+ #
8
+ # Ex:
9
+ # Benchpress::Entity.new(string: -> { 'string' })
10
+ #
11
+ # Warning: Direct instantiation has been deprecated, read the
8
12
  def initialize(opts = {})
9
- @method = opts[:method]
10
- @name = opts[:name] || ''
13
+ raise 'Invalid formatting! Use "name: -> { method }"' unless opts.keys.length == 1
14
+ @name, @method = *opts.flatten
11
15
  @data_points = []
12
16
  end
17
+
18
+ def render_data(step_points)
19
+ @data_points.clear
20
+ step_points.each { |n| @data_points << Benchmark.measure { n.times { @method.call } }.real }
21
+ end
22
+
23
+ def data
24
+ [@name.to_s, @data_points]
25
+ end
13
26
  end
14
27
  end
@@ -1,3 +1,3 @@
1
1
  module Benchpress
2
- VERSION = '0.0.1'
2
+ VERSION = '1.0.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: benchpress
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Weaver
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-06 00:00:00.000000000 Z
11
+ date: 2014-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -45,7 +45,7 @@ dependencies:
45
45
  - - '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
- type: :development
48
+ type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
@@ -64,6 +64,7 @@ files:
64
64
  - Gemfile
65
65
  - LICENSE.txt
66
66
  - README.md
67
+ - RELEASE.md
67
68
  - Rakefile
68
69
  - benchpress.gemspec
69
70
  - lib/benchpress.rb
@@ -73,7 +74,7 @@ files:
73
74
  - lib/benchpress/version.rb
74
75
  homepage: https://github.com/baweaver/Benchpress
75
76
  licenses:
76
- - BSD
77
+ - MIT
77
78
  metadata: {}
78
79
  post_install_message:
79
80
  rdoc_options: []
@@ -94,5 +95,5 @@ rubyforge_project:
94
95
  rubygems_version: 2.1.10
95
96
  signing_key:
96
97
  specification_version: 4
97
- summary: Ruby Benchmark + Gruff to auto-gen charts
98
+ summary: Ruby Benchmark + Gruff to auto-gen charts for method profiline
98
99
  test_files: []