Ruby符号与字符串 - 来回切换性能损失?

Lan*_*ard 11 ruby performance

因此,虽然ruby String是全局唯一的,但ruby Symbol不是,因为它是由id存储在后台的某个地方:

http://thoughtsincomputation.com/posts/ruby-symbols-what-are-they

...这意味着使用符号会占用更少的内存,因为您可以使用符号指定的一组值(例如,您不希望将每个用户输入的文本字符串转换为符号).

我的问题是,虽然使用符号肯定有性能优势,但它最终是否值得?我问,因为,例如,我使用符号写了大部分哈希:

my_hash    = {:_id => "123", :key => "value"}
Run Code Online (Sandbox Code Playgroud)

但是在ruby-mongo-driver中,所有键都以字符串形式返回:

mongo_hash = {"_id" => "123", "key" => "value"}
Run Code Online (Sandbox Code Playgroud)

所以,如果我以同样的方式同时使用我的哈希和mongo哈希,我必须这样做:

mongo_hash = Model.collection.find_one(:key => "value")
#=> {"_id" => "123", "key" => "value"}
mongo_hash.symbolize_keys!
#=> {:_id => "123", :key => "value"}
Run Code Online (Sandbox Code Playgroud)

但这只是为应用程序添加了另一层:

  1. 为内存中的键创建一串字符串.
  2. 现在为每个字符串创建一个符号(在第一次完成后已经在内存中).
  3. 现在销毁我们刚创建的字符串.

这似乎有些不对劲......要么一切都应该是符号或字符串,不应该来回转换,至少在这种情况下.

你怎么看待这件事?这个可以吗?这甚至是一个问题,还是红宝石垃圾收集器和所有这些(还没有去过那里)好吗?

Mik*_*cic 13

除非您认真推动服务器/系统的限制,否则任何一种方法的优点或缺点都可以忽略不计.

当使用绝对需要为其提供字符串键控哈希的库时,简单地使用字符串显然更好,因为它可以使代码清晰简洁,并且无需将键转换为字符串.

Ruby的目标是让开发人员更喜欢编程,并且不会声称自己是最有效的.当我使用Ruby时,我会把它放在心上并使用符号作为哈希中的键,因为它使它们更容易阅读.

当它归结为它时,它是个人偏好,你不会注意到速度的增加/减少.除非您遇到速度/内存约束问题,否则您无需担心.Ruby标准库的其他部分在成为问题之前就会崩溃.

"过早的优化是所有邪恶的根源" - 唐纳德克努特