memory_profiler 0.9.0 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e6f50e313b79d97881748e82320ba77ba9ba837a
4
- data.tar.gz: 06eef05f9dd835ea1cd95f7f794b6345aed60022
3
+ metadata.gz: 4b6b21cb4cecfbff39a58884f5c67e379ee246db
4
+ data.tar.gz: 17fc4f5587f41ce22ebd0445d4a8b207388447b0
5
5
  SHA512:
6
- metadata.gz: 62046435ace9583f49c43519aeb6d07fe8ca8486fc198e2cd739dbed60bfacafd51ccc935b0ac966fddf9b34f15f031c3bf26274967d5c148c8ab925dae8b9c5
7
- data.tar.gz: eb925c93cc41951be2510590860ae507da6e5a2eb7bd7702b53193558f820826e3ff8e7131ba53692ca6c29f943a77fc689ec6c67690f0394edcc7532529171b
6
+ metadata.gz: 842bfb7550e047af23d8db0ac5522da9bf14b39e82d88a332627d679ea6fecd39ba445971656f4758ad0194f30a91f45cbf81d0641934f89f7fba01d7ead7d8e
7
+ data.tar.gz: 754a46b32d671bcee62ea5704a8c636e7d1f20b2d4981cd1f376dc9d1f5156ce54a46469e68eede880d3e2801e5dcf0a6e293dc78eb9d125cb6e95bfcfa44569
data/README.md CHANGED
@@ -1,9 +1,13 @@
1
1
  # MemoryProfiler
2
2
 
3
- A memory profiler for Ruby 2.1.0
3
+ A memory profiler for Ruby
4
4
 
5
5
  [![Build Status](https://travis-ci.org/SamSaffron/memory_profiler.png?branch=master)](https://travis-ci.org/SamSaffron/memory_profiler)
6
6
 
7
+ ## Requirements
8
+
9
+ Ruby(MRI) Version 2.1.0 and above.
10
+
7
11
  ## Installation
8
12
 
9
13
  Add this line to your application's Gemfile:
@@ -29,7 +33,59 @@ end
29
33
  report.pretty_print
30
34
  ```
31
35
 
32
- Example Session:
36
+ ## Options
37
+
38
+ You can use `allow_files` option for displaying only lines which contain string or array with strings:
39
+
40
+ ```
41
+ pry> require 'memory_profiler'
42
+ pry> MemoryProfiler.report(allow_files: 'rubygems'){ require 'mime-types' }.pretty_print
43
+ Total allocated 82375
44
+ Total retained 22618
45
+
46
+ allocated memory by gem
47
+ -----------------------------------
48
+ rubygems x 305879
49
+
50
+ allocated memory by file
51
+ -----------------------------------
52
+ /home/sam/.rbenv/versions/2.1.0-github/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb x 285433
53
+ /home/sam/.rbenv/versions/2.1.0-github/lib/ruby/2.1.0/rubygems/basic_specification.rb x 18597
54
+ /home/sam/.rbenv/versions/2.1.0-github/lib/ruby/2.1.0/rubygems.rb x 2218
55
+ /home/sam/.rbenv/versions/2.1.0-github/lib/ruby/2.1.0/rubygems/specification.rb x 1169
56
+ /home/sam/.rbenv/versions/2.1.0-github/lib/ruby/2.1.0/rubygems/defaults.rb x 520
57
+ /home/sam/.rbenv/versions/2.1.0-github/lib/ruby/2.1.0/rubygems/core_ext/kernel_gem.rb x 80
58
+ /home/sam/.rbenv/versions/2.1.0-github/lib/ruby/2.1.0/rubygems/version.rb x 80
59
+
60
+ . . .
61
+ ```
62
+
63
+ Also you can print report to file. For this use `pretty_print` method with `to_file` option and `path_to_your_log_file` string:
64
+ ```
65
+ $ pry
66
+ pry> require 'memory_profiler'
67
+ pry> MemoryProfiler.report(allow_files: 'rubygems'){ require 'mime-types' }.pretty_print(to_file: 'path_to_your_log_file')
68
+
69
+ $ less my_report.txt
70
+ Total allocated 82375
71
+ Total retained 22618
72
+
73
+ allocated memory by gem
74
+ -----------------------------------
75
+ rubygems x 305879
76
+
77
+ . . .
78
+ ```
79
+
80
+ Other options include:
81
+
82
+ * `top`: maximum number of entries to display in a report
83
+ * `trace`: an array of classes for which you explicitly want to trace object allocations
84
+ * `ignore_files`: a regular expression used to exclude certain files from tracing (opposite of `allow_files`)
85
+
86
+ Check out `Reporter#new` for more details.
87
+
88
+ ## Example Session
33
89
 
34
90
  You can easily use memory_profiler to profile require impact of a gem, for example:
35
91
 
@@ -316,7 +372,7 @@ Memory profiler also performs some String analysis to help you find strings that
316
372
 
317
373
 
318
374
  ### 0.0.4
319
- - Added compatability with released version of Ruby 2.1.0
375
+ - Added compatibility with released version of Ruby 2.1.0
320
376
  - Cleanup to use latest APIs available in 2.1.0
321
377
 
322
378
  ### 0.0.3
@@ -14,6 +14,7 @@ module MemoryProfiler
14
14
  @top = opts[:top] || 50
15
15
  @trace = opts[:trace]
16
16
  @ignore_files = opts[:ignore_files]
17
+ @allow_files = Array(opts[:allow_files])
17
18
  end
18
19
 
19
20
  # Helper for generating new reporter and running against block
@@ -73,6 +74,11 @@ module MemoryProfiler
73
74
  @ignore_files && @ignore_files =~ file
74
75
  end
75
76
 
77
+ def allow_file?(file)
78
+ return true if @allow_files.empty?
79
+ !/#{@allow_files.join('|')}/.match(file).to_s.empty?
80
+ end
81
+
76
82
  # Iterates through objects in memory of a given generation.
77
83
  # Stores results along with meta data of objects collected.
78
84
  def object_list(generation, rvalue_size)
@@ -93,7 +99,7 @@ module MemoryProfiler
93
99
 
94
100
  objs.each do |obj|
95
101
  file = ObjectSpace.allocation_sourcefile(obj)
96
- next if ignore_file?(file)
102
+ next if !allow_file?(file) || ignore_file?(file)
97
103
 
98
104
  line = ObjectSpace.allocation_sourceline(obj)
99
105
  class_path = ObjectSpace.allocation_class_path(obj)
@@ -68,15 +68,17 @@ module MemoryProfiler
68
68
  def string_report(data, top)
69
69
  data
70
70
  .reject { |id, stat| stat.class_name != "String" }
71
- .map { |id, stat| [ObjectSpace._id2ref(id), "#{stat.file}:#{stat.line}"] }
71
+ .map { |id, stat| [begin; ObjectSpace._id2ref(id); rescue "__UNKNOWN__"; end, "#{stat.file}:#{stat.line}"] }
72
72
  .group_by { |string, location| string }
73
73
  .sort_by { |string, list| -list.count }
74
74
  .first(top)
75
75
  .map { |string, list| [string, list.group_by { |str, location| location }
76
- .map { |location, locations| [location, locations.count] }] }
76
+ .map { |location, locations| [location, locations.count] }] }
77
77
  end
78
78
 
79
- def pretty_print(io = STDOUT, options = {})
79
+ def pretty_print(io = STDOUT, **options)
80
+ io = File.open(options[:to_file], "w") if options[:to_file]
81
+
80
82
  color_output = options.fetch(:color_output) { io.respond_to?(:isatty) && io.isatty }
81
83
  @colorize = color_output ? Polychrome.new : Monochrome.new
82
84
 
@@ -87,14 +89,15 @@ module MemoryProfiler
87
89
  .product(["memory", "objects"])
88
90
  .product(["gem", "file", "location"])
89
91
  .each do |(type, metric), name|
90
- dump "#{type} #{metric} by #{name}", self.send("#{type}_#{metric}_by_#{name}"), io
91
- end
92
+ dump "#{type} #{metric} by #{name}", self.send("#{type}_#{metric}_by_#{name}"), io
93
+ end
92
94
 
93
95
  io.puts
94
96
  dump_strings(io, "Allocated", strings_allocated)
95
97
  io.puts
96
98
  dump_strings(io, "Retained", strings_retained)
97
- nil
99
+
100
+ io.close if io.is_a? File
98
101
  end
99
102
 
100
103
  private
@@ -1,3 +1,3 @@
1
1
  module MemoryProfiler
2
- VERSION = "0.9.0"
2
+ VERSION = "0.9.1"
3
3
  end
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.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-06 00:00:00.000000000 Z
11
+ date: 2015-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler