Wrap text
Report abuse
Sample code causes leaks in 1.8.6p238 and p265, but not p111ubuntu
# Helpers
def vsz
File.open("/proc/#{Process.pid}/status"){|h| h.read[/VmSize:\s+(\d+)\s/, 1]}.to_i
end
def measure(title, count=100_000, &block)
puts "# %s" % title
puts "before: %i" % vsz
count.times{yield}
puts "after: %i" % vsz
end
# Does leak
measure("String#=~"){"" =~ //}
measure("String#sub string"){"".sub("", "")}
measure("String#sub regexp"){"".sub(//, "")}
measure("String#[Regexp, Fixnum]"){""[//, 0]}
measure("String#match"){"".match(//)}
measure("Regexp#match"){Regexp.new(//).match("")}
measure("Regexp#~"){$_ = ""; ~ //} # Leaks very fast!
# Doesn't leak
measure("String.new"){""}
measure("String#[]="){"a"[0]="b"}
measure("String#+"){"a"+"b"}
measure("String interpolation"){"#{1/2}"}
measure("String#upcase"){"foo".upcase}
measure("Regexp#new"){Regexp.new("")}