mirror of
https://github.com/ruby/ruby.git
synced 2026-10-28 16:36:20 +08:00
48 lines
939 B
YAML
48 lines
939 B
YAML
prelude: |
|
|
C = Struct.new(:x) do
|
|
def initialize(...)
|
|
super
|
|
@ivar = 42
|
|
end
|
|
|
|
attr_accessor :ivar
|
|
|
|
class_eval <<-END
|
|
def r
|
|
#{'x;'*256}
|
|
end
|
|
def w
|
|
#{'self.x = nil;'*256}
|
|
end
|
|
def rm
|
|
m = method(:x)
|
|
#{'m.call;'*256}
|
|
end
|
|
def wm
|
|
m = method(:x=)
|
|
#{'m.call(nil);'*256}
|
|
end
|
|
def r_ivar
|
|
#{'ivar;'*256}
|
|
end
|
|
END
|
|
end
|
|
# 200 members do not fit in a GC slot, so this struct is not embedded
|
|
H = Struct.new(*(1..200).map { |i| :"m#{i}" }) do
|
|
class_eval <<-END
|
|
def w
|
|
#{'self.m200 = nil;'*256}
|
|
end
|
|
END
|
|
end
|
|
C.new(nil) # ensure common shape is known
|
|
obj = C.new(nil)
|
|
heap_obj = H.new
|
|
benchmark:
|
|
member_reader: "obj.r"
|
|
member_writer: "obj.w"
|
|
member_writer_heap: "heap_obj.w"
|
|
member_reader_method: "obj.rm"
|
|
member_writer_method: "obj.wm"
|
|
ivar_reader: "obj.r_ivar"
|