当前位置:  开发笔记 > 后端 > 正文

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

如何解决《Ruby符号不是垃圾收集的!?那么,使用String不是更好吗?》经验,为你挑选了3个好方法。

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

如果对符号执行相同的操作,则会创建无法进行垃圾回收的对象.

哪个更糟?



1> 小智..:

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

while i < 10000
  i += 1
  :im_using_this_symbol_here
end

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

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

代替

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

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


我可以添加一条经验法则:永远不会将任何用户提供的字符串转换为符号.这将开启DOS攻击的可能性.

2> 小智..:

看作符号几乎总是通过文字创建,这里的内存爆炸可能性不大.它们的用法几乎都需要它们的行为:每次引用符号时,它都是相同的符号.

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

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



3> David Grayso..:

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

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

创建符号后无法更改.

符号没有很多字符串所具有的方法,比如 start_with?

可以非常有效地将符号相互比较以实现相等.

根据Symbol文档,符号应该代表某些东西的名称.我不会用它们来存储任何不能被视为名字的东西.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有