allocation_stats 0.1.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/.gitignore +2 -0
- data/.yardopts +1 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +30 -0
- data/LICENSE +196 -0
- data/README.markdown +377 -0
- data/Rakefile +11 -0
- data/TODO +3 -0
- data/allocation_stats.gemspec +21 -0
- data/examples/my_class.rb +6 -0
- data/examples/trace_my_class_group_by.rb +11 -0
- data/examples/trace_my_class_raw.rb +11 -0
- data/examples/trace_object_allocations.rb +7 -0
- data/examples/trace_psych_group_by.rb +8 -0
- data/examples/trace_psych_keys.rb +8 -0
- data/lib/active_support/core_ext/module/delegation.rb +203 -0
- data/lib/allocation_stats.rb +144 -0
- data/lib/allocation_stats/allocation.rb +137 -0
- data/lib/allocation_stats/allocations_proxy.rb +289 -0
- data/spec/allocation_stats/allocations_proxy_spec.rb +366 -0
- data/spec/allocation_stats_spec.rb +74 -0
- data/spec/spec_helper.rb +35 -0
- metadata +80 -0
@@ -0,0 +1,74 @@
|
|
1
|
+
# Copyright 2013 Google Inc. All Rights Reserved.
|
2
|
+
# Licensed under the Apache License, Version 2.0, found in the LICENSE file.
|
3
|
+
|
4
|
+
require_relative File.join("spec_helper")
|
5
|
+
|
6
|
+
describe AllocationStats do
|
7
|
+
it "should trace everything if TRACE_PROCESS_ALLOCATIONS" do
|
8
|
+
IO.popen({"TRACE_PROCESS_ALLOCATIONS" => "1"}, "ruby -r ./lib/allocation_stats -e 'puts 0'") do |io|
|
9
|
+
out = io.read
|
10
|
+
out.should match("Object Allocation Report")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should only track new objects" do
|
15
|
+
existing_array = [1,2,3,4,5]
|
16
|
+
|
17
|
+
stats = AllocationStats.trace do
|
18
|
+
new_array = [1,2,3,4,5]
|
19
|
+
end
|
20
|
+
|
21
|
+
stats.new_allocations.class.should be Array
|
22
|
+
stats.new_allocations.size.should == 1
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should only track new objects, non-block mode" do
|
26
|
+
existing_array = [1,2,3,4,5]
|
27
|
+
|
28
|
+
stats = AllocationStats.trace
|
29
|
+
new_array = [1,2,3,4,5]
|
30
|
+
stats.stop
|
31
|
+
|
32
|
+
stats.new_allocations.class.should be Array
|
33
|
+
stats.new_allocations.size.should == 1
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should only track new objects; String keys in Hashes count twice :(" do
|
37
|
+
existing_array = [1,2,3,4,5]
|
38
|
+
|
39
|
+
stats = AllocationStats.trace do
|
40
|
+
new_hash = {"foo" => "bar", "baz" => "quux"}
|
41
|
+
end
|
42
|
+
|
43
|
+
stats.new_allocations.size.should == 7
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should only track new objects, using instance method" do
|
47
|
+
existing_array = [1,2,3,4,5]
|
48
|
+
|
49
|
+
stats = AllocationStats.new
|
50
|
+
|
51
|
+
stats.trace do
|
52
|
+
new_object = Object.new
|
53
|
+
new_array = [4]
|
54
|
+
new_string = "yarn"
|
55
|
+
end
|
56
|
+
|
57
|
+
stats.new_allocations.class.should be Array
|
58
|
+
stats.new_allocations.size.should == 3
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should only track new objects" do
|
62
|
+
existing_array = [1,2,3,4,5]
|
63
|
+
|
64
|
+
my_instance = MyClass.new
|
65
|
+
|
66
|
+
stats = AllocationStats.new(burn: 3).trace do
|
67
|
+
# this method instantiates 2**(n-1) Strings on the n'th call
|
68
|
+
my_instance.memoizing_method
|
69
|
+
end
|
70
|
+
|
71
|
+
stats.new_allocations.class.should be Array
|
72
|
+
stats.new_allocations.size.should == 8
|
73
|
+
end
|
74
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Copyright 2013 Google Inc. All Rights Reserved.
|
2
|
+
# Licensed under the Apache License, Version 2.0, found in the LICENSE file.
|
3
|
+
|
4
|
+
require_relative "../lib/allocation_stats"
|
5
|
+
require "yaml"
|
6
|
+
require "yajl"
|
7
|
+
require "pry"
|
8
|
+
|
9
|
+
if RbConfig::CONFIG["MAJOR"].to_i < 2 || RbConfig::CONFIG["MINOR"].to_i < 1
|
10
|
+
warn "Error: AllocationStats requires Ruby 2.1 or greater"
|
11
|
+
exit 1
|
12
|
+
end
|
13
|
+
|
14
|
+
def allocate_a_string_from_spec_helper
|
15
|
+
return "a string from spec_helper"
|
16
|
+
end
|
17
|
+
|
18
|
+
class MyClass
|
19
|
+
def my_method
|
20
|
+
@new_hash = {0 => "foo", 1 => "bar"}
|
21
|
+
end
|
22
|
+
|
23
|
+
MY_METHOD_BODY_LINE = __LINE__ - 3
|
24
|
+
|
25
|
+
# This method allocates a different number of objects each call:
|
26
|
+
# 1st call: 1x Array, 1x String
|
27
|
+
# 2nd call; 2x Strings
|
28
|
+
# 3rd call; 4x Strings
|
29
|
+
# 4th call; 8x Strings
|
30
|
+
def memoizing_method
|
31
|
+
@c ||= []
|
32
|
+
|
33
|
+
(@c.size + 1).times { @c << "string" }
|
34
|
+
end
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: allocation_stats
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sam Rawlins
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-11-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
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
|
+
description: Tooling for tracing object allocations in Ruby 2.1
|
28
|
+
email:
|
29
|
+
- sam.rawlins@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- .gitignore
|
35
|
+
- .yardopts
|
36
|
+
- Gemfile
|
37
|
+
- Gemfile.lock
|
38
|
+
- LICENSE
|
39
|
+
- README.markdown
|
40
|
+
- Rakefile
|
41
|
+
- TODO
|
42
|
+
- allocation_stats.gemspec
|
43
|
+
- examples/my_class.rb
|
44
|
+
- examples/trace_my_class_group_by.rb
|
45
|
+
- examples/trace_my_class_raw.rb
|
46
|
+
- examples/trace_object_allocations.rb
|
47
|
+
- examples/trace_psych_group_by.rb
|
48
|
+
- examples/trace_psych_keys.rb
|
49
|
+
- lib/active_support/core_ext/module/delegation.rb
|
50
|
+
- lib/allocation_stats.rb
|
51
|
+
- lib/allocation_stats/allocation.rb
|
52
|
+
- lib/allocation_stats/allocations_proxy.rb
|
53
|
+
- spec/allocation_stats/allocations_proxy_spec.rb
|
54
|
+
- spec/allocation_stats_spec.rb
|
55
|
+
- spec/spec_helper.rb
|
56
|
+
homepage:
|
57
|
+
licenses:
|
58
|
+
- Apache v2
|
59
|
+
metadata: {}
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>'
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.0.99
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
requirements: []
|
75
|
+
rubyforge_project:
|
76
|
+
rubygems_version: 2.0.3
|
77
|
+
signing_key:
|
78
|
+
specification_version: 4
|
79
|
+
summary: Tooling for tracing object allocations in Ruby 2.1
|
80
|
+
test_files: []
|