hotch 0.0.1 → 0.0.2

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
  SHA1:
3
- metadata.gz: 7b5d9d923cc25d830ae5bdf7c250767e5c036d9a
4
- data.tar.gz: 2600d46dd7b9c7b2554fe3a28e20fe2ed9ac26b6
3
+ metadata.gz: 38cc02398ab2755f8c90da8ae6ea973db46de9b7
4
+ data.tar.gz: 938117da7ad53717ba52d5507c9b4b8575317068
5
5
  SHA512:
6
- metadata.gz: f1f8a1519c968110d4696b7476a98dd0444a3681ec8d93b7c103d34de1f0817925661c9868907fa6f3b85095d7efdc2bb119ff0f39e163e778795e6eade66091
7
- data.tar.gz: a46d658d2b27f15889c0a936c0d8abdb6896d31c54a66aa525fadc0f0d1cfce48784d7e9536119d99bdf7039b83d4c2ab6e058e982c7d1b3180b15d3e01e916e
6
+ metadata.gz: 91eaa4af1f66add4591182e39b47192325b5842e7bb87176aba19491e071880394d6421288590943683f2103e970e143f07bd535b3eb758fc393ba1919187f17
7
+ data.tar.gz: 485b40654f50784ec3e08483fac13b4b01b41fefa47790e8d25abf9cf99d32ab720f49169517cda9b662de3ddd72128415c52054b28f1c0850b2313be4e1a8c2
data/README.md CHANGED
@@ -27,10 +27,40 @@ Or install it yourself as:
27
27
 
28
28
  ## Usage
29
29
 
30
- $ ruby -rhotch my_program.rb
30
+ ### Profile complete program
31
+
32
+ $ ruby -rhotch/run my_program.rb
31
33
  Profile SVG: /tmp/hotch.my_program20150104-17330-18t4171/profile.svg
32
34
  $ view /tmp/hotch.my_program20150104-17330-18t4171/profile.svg
33
35
 
36
+ ### Profile blocks in your program
37
+
38
+ ```ruby
39
+ require 'hotch'
40
+
41
+ def expensive_method
42
+ # ...
43
+ end
44
+
45
+ Hotch() do
46
+ 1000.times do
47
+ expensive_method
48
+ end
49
+ end
50
+
51
+ Hotch(aggregate: false) do
52
+ 1000.times do
53
+ # this run is not aggregated
54
+ end
55
+ end
56
+
57
+ Hotch() do
58
+ 1000.times do
59
+ # aggregated again
60
+ end
61
+ end
62
+ ```
63
+
34
64
  ### Auto-view
35
65
 
36
66
  Set envvar `HOTCH_VIEWER` to enable auto-view after profiling.
@@ -0,0 +1,23 @@
1
+ require 'hotch'
2
+
3
+ COUNT = ENV.fetch('COUNT', 10_000)
4
+
5
+ def foo
6
+ "x" * 23
7
+ end
8
+
9
+ def bar
10
+ ["x"] * 23
11
+ end
12
+
13
+ Hotch(aggregate: false) do
14
+ COUNT.times do
15
+ foo
16
+ end
17
+ end
18
+
19
+ Hotch() do
20
+ COUNT.times do
21
+ bar
22
+ end
23
+ end
data/lib/hotch.rb CHANGED
@@ -1,32 +1,92 @@
1
1
  require 'stackprof'
2
2
  require 'tmpdir'
3
3
 
4
- HOTCH_VIEWER = ENV['HOTCH_VIEWER']
4
+ class Hotch
5
+ attr_reader :name
5
6
 
6
- NAME = $0.gsub(/\W/, '_')
7
+ def initialize(name)
8
+ @name = name
9
+ @reports = []
10
+ end
7
11
 
8
- StackProf.start
12
+ def start(*args)
13
+ StackProf.start(*args) unless StackProf.running?
14
+ end
9
15
 
10
- def system!(*args)
11
- system(*args) or raise "system call failed: #{args.join(' ')}"
12
- end
16
+ def stop
17
+ if StackProf.running?
18
+ StackProf.stop
19
+ @reports << StackProf::Report.new(results)
20
+ end
21
+ end
22
+
23
+ def run(*args)
24
+ start(*args)
25
+ yield
26
+ ensure
27
+ stop
28
+ end
29
+
30
+ def results
31
+ StackProf.results
32
+ end
33
+
34
+ def report
35
+ report = @reports.inject(:+) or return
36
+
37
+ dir = Dir.mktmpdir("hotch.#{name}.")
38
+ dump = File.open(File.join(dir, "profile.dump"), "wb")
39
+ svg = File.join(File.join(dir, "profile.svg"))
40
+
41
+
42
+ report.print_graphviz(nil, dump)
13
43
 
14
- at_exit do
15
- StackProf.stop
44
+ dump.close
16
45
 
17
- dir = Dir.mktmpdir("hotch.#{NAME}")
18
- dump = File.open(File.join(dir, "profile.dump"), "wb")
19
- svg = File.join(File.join(dir, "profile.svg"))
46
+ system! "dot", "-Tsvg", "-o", svg, dump.path
20
47
 
21
- StackProf::Report.new(StackProf.results).print_graphviz(nil, dump)
48
+ yield svg
49
+ end
50
+
51
+ def system!(*args)
52
+ Kernel.system(*args) or raise "system call failed: #{args.join(' ')}"
53
+ end
54
+
55
+ def report_at_exit(viewer=ENV['HOTCH_VIEWER'])
56
+ return if defined? @at_exit_installed
57
+
58
+ at_exit do
59
+ stop
60
+
61
+ report do |svg|
62
+ puts "Profile SVG: #{svg}"
22
63
 
23
- dump.close
64
+ if viewer
65
+ system viewer, svg
66
+ end
67
+ end
68
+ end
24
69
 
25
- system! "dot", "-Tsvg", "-o", svg, dump.path
70
+ @at_exit_installed = true
71
+ end
72
+
73
+ private
74
+
75
+ def name
76
+ @name.gsub(/\W+/, '_')
77
+ end
78
+ end
26
79
 
27
- puts "Profile SVG: #{svg}"
80
+ def Hotch(aggregate: true)
81
+ hotch = if aggregate
82
+ $hotch ||= Hotch.new($0)
83
+ else
84
+ caller = Kernel.caller_locations(1).first
85
+ Hotch.new("#$0:#{caller.path}:#{caller.lineno}")
86
+ end
28
87
 
29
- if viewer = HOTCH_VIEWER
30
- system! viewer, svg
88
+ hotch.report_at_exit
89
+ hotch.run do
90
+ yield
31
91
  end
32
92
  end
data/lib/hotch/run.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'hotch'
2
+
3
+ viewer = ENV['HOTCH_VIEWER']
4
+
5
+ hotch = Hotch.new($0)
6
+ hotch.start
7
+
8
+ hotch.report_at_exit(viewer)
data/lib/hotch/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Hotch
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hotch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Suschlik
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-04 00:00:00.000000000 Z
11
+ date: 2015-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: stackprof
@@ -64,8 +64,10 @@ files:
64
64
  - LICENSE.txt
65
65
  - README.md
66
66
  - Rakefile
67
+ - examples/simple.rb
67
68
  - hotch.gemspec
68
69
  - lib/hotch.rb
70
+ - lib/hotch/run.rb
69
71
  - lib/hotch/version.rb
70
72
  homepage: https://github.com/splattael/hotch
71
73
  licenses:
@@ -87,9 +89,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
89
  version: '0'
88
90
  requirements: []
89
91
  rubyforge_project:
90
- rubygems_version: 2.4.5
92
+ rubygems_version: 2.2.2
91
93
  signing_key:
92
94
  specification_version: 4
93
95
  summary: Profile helper
94
96
  test_files: []
95
- has_rdoc: