Module: ObjectStats
- Defined in:
- lib/utilrb/objectstats.rb
Constant Summary collapse
- LIVE_OBJECTS_KEY =
:live_objects
Class Method Summary collapse
-
.count ⇒ Object
The count of objects currently allocated.
-
.count_by_class ⇒ Object
Returns a klass => count hash counting the currently allocated objects.
-
.profile(alive = false) ⇒ Object
Profiles how much objects has been allocated by the block.
Class Method Details
.count ⇒ Object
The count of objects currently allocated
It allocates no objects, which means that if a = ObjectStats.count b = ObjectStats.count then a == b
12 13 14 15 16 17 |
# File 'lib/utilrb/objectstats.rb', line 12 def self.count count = 0 ObjectSpace.each_object { |obj| count += 1 } count end |
.count_by_class ⇒ Object
Returns a klass => count hash counting the currently allocated objects
It allocates 1 Hash, which is included in the count
22 23 24 25 26 27 28 29 30 |
# File 'lib/utilrb/objectstats.rb', line 22 def self.count_by_class by_class = Hash.new(0) ObjectSpace.each_object { |obj| by_class[obj.class] += 1 by_class } by_class end |
.profile(alive = false) ⇒ Object
Profiles how much objects has been allocated by the block. Returns a klass => count hash like count_by_class
If alive is true, then only live objects are returned.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/utilrb/objectstats.rb', line 38 def self.profile(alive = false) if alive GC.force profile do yield GC.force end end already_disabled = GC.disable before = count_by_class if ObjectSpace.respond_to?(:live_objects) before_live_objects = ObjectSpace.live_objects end yield if ObjectSpace.respond_to?(:live_objects) after_live_objects = ObjectSpace.live_objects end after = count_by_class if after_live_objects before[LIVE_OBJECTS_KEY] = before_live_objects after[LIVE_OBJECTS_KEY] = after_live_objects - 1 # correction for yield end GC.enable unless already_disabled after[Hash] -= 1 # Correction for the call of count_by_class profile = before. merge(after) { |klass, old, new| new - old }. delete_if { |klass, count| count == 0 } end |