Skip to content

Commit e00842d

Browse files
sinsokumame
authored andcommitted
Lazily initialize MethodEntity collections
MethodEntity#initialize was allocating 4 Sets and 1 Hash eagerly. Use lazy accessor methods to defer allocation until first use. Most MethodEntity instances are created during module resolution but many fields are never populated. Measured with tool/dog_bench.rb (stackprof, cumulative with prior commits): - GC overhead: 28.6% -> 23.7% - Total samples: 1038 -> 1001
1 parent b14bf4a commit e00842d

1 file changed

Lines changed: 18 additions & 15 deletions

File tree

lib/typeprof/core/env/method_entity.rb

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,60 +2,63 @@ module TypeProf::Core
22
class MethodEntity
33
def initialize
44
@builtin = nil
5-
@decls = Set.empty
6-
@overloading_decls = Set.empty
7-
@defs = Set.empty
8-
@aliases = {}
9-
@method_call_boxes = Set.empty
105
end
116

12-
attr_reader :decls, :defs, :aliases, :method_call_boxes
137
attr_accessor :builtin
148

9+
def decls = @decls ||= Set.empty
10+
def defs = @defs ||= Set.empty
11+
def aliases = @aliases ||= {}
12+
def method_call_boxes = @method_call_boxes ||= Set.empty
13+
14+
private def overloading_decls = @overloading_decls ||= Set.empty
15+
1516
def add_decl(decl)
1617
if decl.overloading
17-
@overloading_decls << decl
18+
overloading_decls << decl
1819
else
19-
@decls << decl
20+
decls << decl
2021
end
2122
end
2223

2324
def remove_decl(decl)
2425
if decl.overloading
25-
@overloading_decls.delete(decl) || raise
26+
overloading_decls.delete(decl) || raise
2627
else
27-
@decls.delete(decl) || raise
28+
decls.delete(decl) || raise
2829
end
2930
end
3031

3132
def add_def(mdef)
32-
@defs << mdef
33+
defs << mdef
3334
self
3435
end
3536

3637
def remove_def(mdef)
37-
@defs.delete(mdef) || raise
38+
defs.delete(mdef) || raise
3839
end
3940

4041
def add_alias(node, old_mid)
41-
@aliases[node] = old_mid
42+
aliases[node] = old_mid
4243
end
4344

4445
def remove_alias(node)
45-
@aliases.delete(node) || raise
46+
aliases.delete(node) || raise
4647
end
4748

4849
def exist?
49-
@builtin || !@decls.empty? || !@defs.empty?
50+
@builtin || (@decls && !@decls.empty?) || (@defs && !@defs.empty?)
5051
end
5152

5253
def add_run_all_mdefs(genv)
54+
return unless @defs
5355
@defs.each do |mdef|
5456
genv.add_run(mdef)
5557
end
5658
end
5759

5860
def add_run_all_method_call_boxes(genv)
61+
return unless @method_call_boxes
5962
@method_call_boxes.each do |box|
6063
genv.add_run(box)
6164
end

0 commit comments

Comments
 (0)