10

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

如果你对符号做同样的事情,你会创建不能被垃圾回收的对象。

哪个更糟?

4

3 回答 3

9

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

while i < 10000
  i += 1
  :im_using_this_symbol_here
end

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

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

代替

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

在您的应用程序中一遍又一遍地重复使用操作。

于 2009-03-19T11:44:27.867 回答
7

由于符号几乎总是通过文字创建的,因此这里内存爆炸的可能性不大。它们的行为在很大程度上是由它们的用法所要求的:每次你引用一个符号时,它都是同一个。

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

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

于 2009-03-18T19:32:23.040 回答
6

如果您使用的是 Ruby 2.2.0 或更高版本,通常应该可以动态创建大量符号,因为它们将根据Ruby 2.2.0-preview1 公告进行垃圾收集,该公告提供了有关新符号 GC。但是,如果您将动态符号传递给某种将其转换为 ID(C 源代码中使用的内部 Ruby 实现概念)的代码,那么在这种情况下,它将被固定并且永远不会被垃圾收集。我不确定这种情况发生的频率有多高。

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

  • 符号在创建后不能更改。
  • 符号没有很多字符串有的方法,比如start_with?
  • 符号可以非常有效地相互比较以获得相等性。
  • 根据Symbol docs ,符号应该代表某物的名称。我不会使用它们来存储任何不能被视为名称的东西。
于 2014-09-25T16:34:07.803 回答