Символы Ruby против строк - потеря производительности при переключении вперед и назад?

Итак, хотя рубин String глобально уникален, символ рубина - нет, потому что он хранится по идентификатору где-то в фоновом режиме:

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

... Это означает, что использование символов требует меньше памяти, учитывая, что у вас есть определенный набор значений, которыми может быть символ (например, вы не хотите превращать каждую строку введенного пользователем текста в символ).

Мой вопрос: Хотя использование символов определенно дает преимущество в производительности, стоит ли оно того в конечном итоге? Я спрашиваю, потому что, например, я пишу большинство своих хэшей, используя символы:

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

Но в драйвере ruby-mongo все ключи возвращаются в виде строк:

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

Итак, если бы я использовал оба моих хэша и хеш монго таким же образом, я должен был бы сделать:

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

Но это просто добавляет еще один уровень к приложению:

  1. Создайте связку строк для ключей в памяти.
  2. Теперь создайте символ для каждой строки (уже в памяти после того, как это было сделано в первый раз).
  3. Теперь уничтожьте только что созданные строки.

Кажется, что-то здесь не так ... либо все должно быть символы или строки, по крайней мере, в этом случае не должно быть преобразования назад и вперед.

Что вы думаете об этом? Это нормально? Это вообще проблема, или сборщик мусора Ruby и все такое (еще не дошло) с этим согласны?

11
задан Lance Pollard 1 May 2011 в 03:20
поделиться