【发布时间】:2017-07-28 01:15:36
【问题描述】:
我一直在阅读有关在我的 Ruby/Rails 应用程序中减少内存使用的方法,其中一件事是 mentioned 是冻结对象。我已经尝试了下面的代码(MRI,Ruby 2.3.3),根据活动监视器,与不冻结字符串相比,它确实节省了内存。
pipeline = []
100_000.times { pipeline << 'hello world'.freeze }
但是,如果我尝试使用散列文字进行相同操作,它会占用大量内存,除非我将散列分配给变量并在之前将其冻结。
pipeline = []
100_000.times { pipeline << {hello: 'world'}.freeze } # Uses about 25MB
my_hash = {hello: 'world'}
my_hash.freeze
100_000.times { pipeline << my_hash} # This uses about 1MB
谁能解释为什么?我一直认为字符串情况有点奇怪,因为看起来您只是在创建许多不同的字符串对象,分别冻结每个对象,并向数组中添加大量冻结对象。不知道为什么它有效,但是,它确实有效。现在,哈希大小写更符合我的预期,但我不知道为什么它的行为不像字符串。
【问题讨论】:
标签: ruby