Skip to content

Instantly share code, notes, and snippets.

@zlx
Last active May 5, 2016 08:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zlx/e461d7002e7eb1e51f304ef0958cfbfa to your computer and use it in GitHub Desktop.
Save zlx/e461d7002e7eb1e51f304ef0958cfbfa to your computer and use it in GitHub Desktop.
class Foo
def large_return
return mini_return.map { |i| gen_str(i) }
end
def large_return_with_freeze
return mini_return.map { |i| gen_str(i).freeze }
end
def mini_return
return (1...10_000)
end
def gen_str(index)
's' * (100 + index)
end
end
class FooTest
def test_method_momery(method)
before = get_memory_usage
foo = Foo.new
100.times do |i|
foo.send(method).each do |i|
j = yield(i, foo)
j.gsub(/s{50}/, '').length == 50 ? '.' : 'x'
end
end
after = get_memory_usage
puts "Memory: #{(after-before) / 1000}M"
end
def test_large_return
test_method_momery(:large_return) {|i| i }
end
def test_large_return_with_freeze
test_method_momery(:large_return_with_freeze) {|i| i }
end
def test_mini_return
test_method_momery(:mini_return) {|i, foo| foo.gen_str(i) }
end
def test_another_large_array
before = get_memory_usage
foo = Foo.new
100.times do |i|
large_array = foo.mini_return.map{ |i| foo.gen_str(i) }
large_array.each do |j|
j.gsub(/s{50}/, '').length == 50 ? '.' : 'x'
end
end
after = get_memory_usage
puts "Memory: #{(after-before) / 1000}M"
end
def get_memory_usage
`ps -o rss= -p #{Process.pid}`.to_i
end
end
t = FooTest.new
#t.test_large_return #=> Memory: 241M
#t.test_mini_return #=> Memory: 113M
#t.test_another_large_array #=> Memory: 227M
#t.test_large_return_with_freeze #=> Memory: 243M
@zlx
Copy link
Author

zlx commented May 5, 2016

小心使用大数组

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment