require-prof 0.0.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.
- data/README.markdown +22 -0
- data/lib/require-prof.rb +71 -0
- data/require-prof.gemspec +12 -0
- metadata +68 -0
data/README.markdown
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require-prof allows you to easily profile your Ruby project's imports:
|
2
|
+
|
3
|
+
```shell
|
4
|
+
irb -r require-prof -r <path to your code>
|
5
|
+
```
|
6
|
+
|
7
|
+
Then just run
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
RequireProf.print_timing_infos
|
11
|
+
```
|
12
|
+
|
13
|
+
to see the time breakdown of your requires in chronological order. Run
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
RequireProf.print_timing_infos_for_optimization
|
17
|
+
```
|
18
|
+
|
19
|
+
to see the time breakdown by amount of time spent.
|
20
|
+
|
21
|
+
If you set the environment variable RUBY_REQUIRE_PRINT_LIVE to 'true',
|
22
|
+
require-prof will print out import timing information as it happens.
|
data/lib/require-prof.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
module RequireProf
|
2
|
+
@@print_live = (print_live = ENV['RUBY_REQUIRE_PRINT_LIVE']) && (print_live != 'false')
|
3
|
+
|
4
|
+
@@orig_require = method(:require)
|
5
|
+
@@orig_load = method(:load)
|
6
|
+
@@global_start = Time.now
|
7
|
+
@@level = 0
|
8
|
+
@@lower_level_progress = 0
|
9
|
+
@@timing_info = []
|
10
|
+
|
11
|
+
def self.backend_requiring(orig_method, name, args)
|
12
|
+
initial_lower_level_progress = @@lower_level_progress
|
13
|
+
spacing = ' ' * @@level
|
14
|
+
start_at = Time.now
|
15
|
+
cumulative_duration = start_at - @@global_start
|
16
|
+
|
17
|
+
if @@print_live
|
18
|
+
$stderr.puts "#{spacing}[#{cumulative_duration}s] BEGIN #{name} #{args.inspect}..."
|
19
|
+
end
|
20
|
+
|
21
|
+
@@level += 1
|
22
|
+
orig_method.call(*args)
|
23
|
+
@@level -= 1
|
24
|
+
|
25
|
+
end_at = Time.now
|
26
|
+
cumulative_duration = end_at - @@global_start
|
27
|
+
total_duration = end_at - start_at
|
28
|
+
my_duration = total_duration - (@@lower_level_progress - initial_lower_level_progress)
|
29
|
+
|
30
|
+
if @@print_live
|
31
|
+
print_timing_entry(my_duration, total_duration, cumulative_duration, spacing, "END #{name}", args)
|
32
|
+
end
|
33
|
+
|
34
|
+
@@timing_info << [my_duration, total_duration, cumulative_duration, spacing, name, args]
|
35
|
+
@@lower_level_progress += my_duration
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.require(*args)
|
39
|
+
backend_requiring(@@orig_require, 'requiring', args)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.load(*args)
|
43
|
+
backend_requiring(@@orig_load, 'loading', args)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.print_timing_infos_for_optimization
|
47
|
+
@@timing_info.sort_by { |timing| timing.first }.each do |my_duration, _, _, _, name, args|
|
48
|
+
$stderr.puts "#{my_duration} -- #{name} #{args.inspect}"
|
49
|
+
end
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.print_timing_infos
|
54
|
+
@@timing_info.each { |entry| print_timing_entry(*entry) }
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def self.print_timing_entry(my_duration, total_duration, cumulative_duration, spacing, name, args)
|
61
|
+
$stderr.puts "#{spacing}[#{cumulative_duration}s] #{name} #{args.inspect}. Took a cumulative #{total_duration}s (#{my_duration}s outside of sub-requires)."
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def require(*args)
|
66
|
+
RequireProf.require(*args)
|
67
|
+
end
|
68
|
+
|
69
|
+
def load(*args)
|
70
|
+
RequireProf.load(*args)
|
71
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'require-prof'
|
3
|
+
s.version = '0.0.1'
|
4
|
+
s.authors = ["Greg Brockman"]
|
5
|
+
s.email = ["gdb@gregbrockman.com"]
|
6
|
+
s.homepage = 'https://github.com/gdb/require-prof'
|
7
|
+
s.summary = %q{Profile your project's requires}
|
8
|
+
s.description = %q{Use require-prof to see how long you spend importing various code}
|
9
|
+
|
10
|
+
s.files = `git ls-files`.split("\n")
|
11
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: require-prof
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Greg Brockman
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-01-30 00:00:00 Z
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: Use require-prof to see how long you spend importing various code
|
22
|
+
email:
|
23
|
+
- gdb@gregbrockman.com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- README.markdown
|
32
|
+
- lib/require-prof.rb
|
33
|
+
- require-prof.gemspec
|
34
|
+
homepage: https://github.com/gdb/require-prof
|
35
|
+
licenses: []
|
36
|
+
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 3
|
48
|
+
segments:
|
49
|
+
- 0
|
50
|
+
version: "0"
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
requirements: []
|
61
|
+
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 1.8.8
|
64
|
+
signing_key:
|
65
|
+
specification_version: 3
|
66
|
+
summary: Profile your project's requires
|
67
|
+
test_files: []
|
68
|
+
|