Last active
May 5, 2016 08:34
-
-
Save zlx/e461d7002e7eb1e51f304ef0958cfbfa to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
小心使用大数组