memory_profiler 0.9.8 → 0.9.9
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 +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +3 -2
- data/lib/memory_profiler/helpers.rb +4 -0
- data/lib/memory_profiler/reporter.rb +10 -3
- data/lib/memory_profiler/results.rb +21 -10
- data/lib/memory_profiler/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7bad0d25de1214584652c298193da15c2306470
|
4
|
+
data.tar.gz: 58b4c27c8e49262703918d27f08e9a2d25b7ba90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 724ecac4311bd0080037b9694d0fcf01d5ccce32886257d5fcdaf7a18fd5a1391d2296878b791b2ab30e7fc6086afc8381878ffa097e041b1eab1f983ce8164a
|
7
|
+
data.tar.gz: 9ddb1527672a92743baa9c29f0cb3ec2db1fda0336b3502197a614decd8d547a3bf2a8c1946b7809b666a98f27da7f344e2b6634d13e9fe08b396d0a8eec329a
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
+
[](https://travis-ci.org/SamSaffron/memory_profiler)
|
2
|
+
[](https://rubygems.org/gems/memory_profiler)
|
3
|
+
|
1
4
|
# MemoryProfiler
|
2
5
|
|
3
6
|
A memory profiler for Ruby
|
4
7
|
|
5
|
-
[](https://travis-ci.org/SamSaffron/memory_profiler)
|
6
|
-
|
7
8
|
## Requirements
|
8
9
|
|
9
10
|
Ruby(MRI) Version 2.1.0 and above.
|
@@ -5,6 +5,7 @@ module MemoryProfiler
|
|
5
5
|
@gem_guess_cache = Hash.new
|
6
6
|
@location_cache = Hash.new { |h,k| h[k] = Hash.new.compare_by_identity }
|
7
7
|
@class_name_cache = Hash.new.compare_by_identity
|
8
|
+
@string_cache = Hash.new
|
8
9
|
end
|
9
10
|
|
10
11
|
def guess_gem(path)
|
@@ -28,5 +29,8 @@ module MemoryProfiler
|
|
28
29
|
@class_name_cache[klass] ||= ((klass.is_a?(Class) && klass.name) || '<<Unknown>>').to_s
|
29
30
|
end
|
30
31
|
|
32
|
+
def lookup_string(obj)
|
33
|
+
@string_cache[obj] ||= String.new << obj
|
34
|
+
end
|
31
35
|
end
|
32
36
|
end
|
@@ -64,8 +64,15 @@ module MemoryProfiler
|
|
64
64
|
# Collects object allocation and memory of ruby code inside of passed block.
|
65
65
|
def run(&block)
|
66
66
|
start
|
67
|
-
|
68
|
-
|
67
|
+
begin
|
68
|
+
block.call
|
69
|
+
rescue Exception
|
70
|
+
ObjectSpace.trace_object_allocations_stop
|
71
|
+
GC.enable
|
72
|
+
raise
|
73
|
+
else
|
74
|
+
stop
|
75
|
+
end
|
69
76
|
end
|
70
77
|
|
71
78
|
private
|
@@ -100,7 +107,7 @@ module MemoryProfiler
|
|
100
107
|
class_name = helper.lookup_class_name(klass)
|
101
108
|
gem = helper.guess_gem(file)
|
102
109
|
|
103
|
-
string =
|
110
|
+
string = klass == String ? helper.lookup_string(obj) : nil
|
104
111
|
|
105
112
|
memsize = ObjectSpace.memsize_of(obj) + rvalue_size_adjustment
|
106
113
|
# compensate for API bug
|
@@ -63,6 +63,9 @@ module MemoryProfiler
|
|
63
63
|
# @param [Hash] options the options for output
|
64
64
|
# @option opts [String] :to_file a path to your log file
|
65
65
|
# @option opts [Boolean] :color_output a flag for whether to colorize output
|
66
|
+
# @option opts [Integer] :retained_strings how many retained strings to print
|
67
|
+
# @option opts [Integer] :allocated_strings how many allocated strings to print
|
68
|
+
# @option opts [Boolean] :detailed_report should report include detailed information
|
66
69
|
def pretty_print(io = $stdout, **options)
|
67
70
|
# Handle the special case that Ruby PrettyPrint expects `pretty_print`
|
68
71
|
# to be a customized pretty printing function for a class
|
@@ -76,26 +79,34 @@ module MemoryProfiler
|
|
76
79
|
io.puts "Total allocated: #{total_allocated_memsize} bytes (#{total_allocated} objects)"
|
77
80
|
io.puts "Total retained: #{total_retained_memsize} bytes (#{total_retained} objects)"
|
78
81
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
82
|
+
if options[:detailed_report] != false
|
83
|
+
io.puts
|
84
|
+
["allocated", "retained"]
|
85
|
+
.product(["memory", "objects"])
|
86
|
+
.product(["gem", "file", "location", "class"])
|
87
|
+
.each do |(type, metric), name|
|
88
|
+
dump "#{type} #{metric} by #{name}", self.send("#{type}_#{metric}_by_#{name}"), io
|
89
|
+
end
|
90
|
+
end
|
86
91
|
|
87
92
|
io.puts
|
88
|
-
dump_strings(io, "Allocated", strings_allocated)
|
93
|
+
dump_strings(io, "Allocated", strings_allocated, limit: options[:allocated_strings])
|
89
94
|
io.puts
|
90
|
-
dump_strings(io, "Retained", strings_retained)
|
95
|
+
dump_strings(io, "Retained", strings_retained, limit: options[:retained_strings])
|
91
96
|
|
92
97
|
io.close if io.is_a? File
|
93
98
|
end
|
94
99
|
|
95
100
|
private
|
96
101
|
|
97
|
-
def dump_strings(io, title, strings)
|
102
|
+
def dump_strings(io, title, strings, limit: nil)
|
98
103
|
return unless strings
|
104
|
+
|
105
|
+
if limit
|
106
|
+
return if limit == 0
|
107
|
+
strings = strings[0...limit]
|
108
|
+
end
|
109
|
+
|
99
110
|
io.puts "#{title} String Report"
|
100
111
|
io.puts @colorize.line("-----------------------------------")
|
101
112
|
strings.each do |string, stats|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memory_profiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Memory profiling routines for Ruby 2.1+
|
14
14
|
email:
|
@@ -50,7 +50,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
50
50
|
version: '0'
|
51
51
|
requirements: []
|
52
52
|
rubyforge_project:
|
53
|
-
rubygems_version: 2.
|
53
|
+
rubygems_version: 2.6.13
|
54
54
|
signing_key:
|
55
55
|
specification_version: 4
|
56
56
|
summary: Memory profiling routines for Ruby 2.1+
|