gpt4 book ai didi

ruby - 为什么卡住哈希文字与卡住字符串文字不同?

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:56 24 4
gpt4 key购买 nike

我一直在阅读有关减少 Ruby/Rails 应用程序内存使用的方法,其中一件事是 mentioned正在卡住物体。我已经尝试了下面的代码(MRI,Ruby 2.3.3),根据 Activity Monitor,与不卡住字符串相比,它确实节省了内存。

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 优化器可能会在一个循环到下一个循环中将该字符串识别为相同的情况,但它无法识别该哈希是相同的,因此它会生成新的。在第二个变体中,您实际上使用了相同的散列,以便优化器可以处理它。

为了证明,看这个:

pipeline = []
100_000.times { pipeline << 'hello world'.freeze }
pipeline.map(&:object_id).uniq.length
# => 1

这是一组相同的对象,只有一个分配。

pipeline = []
100_000.times { pipeline << {hello: 'world'}.freeze }

pipeline.map(&:object_id).uniq.length
# => 100000

那是 100,000 个不同的对象。

关于ruby - 为什么卡住哈希文字与卡住字符串文字不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45363371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com