Ruby符号不是垃圾收集的!?那么,使用String不是更好吗?

时间:2009-03-18 19:28:58

标签: ruby performance memory garbage-collection symbols

如果在循环中创建10,000个字符串,则必须进行大量垃圾收集,这会占用大量资源。

如果对符号执行相同操作,则可以创建cannot be garbage collected

的对象

哪个更糟?

3 个答案:

答案 0 :(得分:9)

如果在循环中引用相同的符号,则不必每次都重新创建该对象,即

while i < 10000
  i += 1
  :im_using_this_symbol_here
end

现在,如果您在其中使用字符串,则字符串将重新创建10K次。通常,在几乎将文字视为常量或键的情况下使用符号。对我来说一个很好的例子就是

link_to "News", :action => 'news'

而不是

link_to "News", "action" => 'news'

在您的应用程序中反复使用的操作。

答案 1 :(得分:7)

看起来几乎总是通过文字创建符号,这里的内存爆炸可能性不大。他们的用法非常需要他们的行为:每当你提到一个符号时,它就是同一个符号。

类似地,字符串在Ruby中必须是唯一的。这是由于它们的使用方式 - 文本处理等。

根据语义决定使用哪一个,不要过早优化。

答案 2 :(得分:6)

如果您使用的是Ruby 2.2.0或更高版本,通常可以动态创建大量符号,因为它们将根据Ruby 2.2.0-preview1 announcement进行垃圾回收,其中包含{{3}的链接}}。但是,如果将动态符号传递给某种将其转换为ID的代码(C源代码中使用的内部Ruby实现概念),那么在这种情况下它将被固定并且永远不会被垃圾收集。我不确定这种情况有多常见。

在决定是否使用符号或字符串时,您应该考虑:

  • 创建符号后无法更改。
  • 符号没有很多字符串,例如start_with?
  • 可以非常有效地将符号与彼此进行比较。
  • 符号应根据more details about the new symbol GC表示某些内容的名称。我不会用它来存储任何不能被视为名字的东西。