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

时间:2011-05-01 03:20:54

标签: ruby performance

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

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

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

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

my_hash    = {:_id => "123", :key => "value"}

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

mongo_hash = {"_id" => "123", "key" => "value"}

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

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

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

  1. 为内存中的密钥创建一串字符串。
  2. 现在为每个字符串创建一个符号(在第一次完成后已经在内存中)。
  3. 现在销毁我们刚创建的字符串。
  4. 似乎有些不对劲......要么一切都应该是符号或字符串,不应该来回转换,至少在这种情况下是这样。

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

1 个答案:

答案 0 :(得分:13)

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

当使用绝对需要的库时,你给它一个字符串键入的哈希值,显然最好简单地使用字符串,因为它可以保持代码清晰简洁,并且不需要你把键转换为字符串。

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

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

“过早优化是所有邪恶的根源” - Donald Knuth