Ruby Symbols vs. Strings - Потеря производительности путем переключения туда и обратно?

Итак, хотя ruby ​​ String глобально уникален, ruby ​​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_hash = Model.collection.find_one(:key => "value")
#=> {"_id" => "123", "key" => "value"}
mongo_hash.symbolize_keys!
#=> {:_id => "123", :key => "value"}

Но это просто добавляет еще один слой в приложение:

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

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

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

Ответ 1

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

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

Ruby стремится сделать программирование более приятным для разработчика и не претендует на то, чтобы быть наиболее эффективным. Когда я использую Ruby, я принимаю это близко к сердцу и использую Символы для ключей в своих хэшах просто потому, что это облегчает их чтение.

Когда дело доходит до этого, это личное предпочтение, и вы не заметите увеличения/уменьшения скорости в любом случае. Если вы не сталкиваетесь с проблемами ограничения скорости и памяти, вам не о чем беспокоиться. Другие части стандартной библиотеки Ruby начнут распадаться, прежде чем это станет проблемой.

"Преждевременная оптимизация - это корень всего зла" - Дональд Кнут