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


所以虽然是红宝石 String 是全球独一无二的,红宝石 Symbol 不是,因为它是由id存储在后台的某个地方:

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

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

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

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. 现在销毁我们刚创建的字符串。

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

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


9475
2018-05-01 03:20


起源

您是使用mongo ruby​​驱动程序作为示例还是作为应用程序的一部分? - Wes
我认为这是ruby-mongo-driver的API设计失败。 - sawa


答案:


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

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

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

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

“过早优化是万恶之源” - 唐纳德克努特


13
2018-05-01 04:07



+1为 “无论如何,你都不会注意到速度增加/减少”。 - Phrogz