Ruby Symbols vs. Strings - Потеря производительности при переключении назад и вперед? - PullRequest
11 голосов
/ 01 мая 2011

Таким образом, в то время как рубин String является глобально уникальным, рубин Symbol не является таковым, поскольку он хранится в id где-то на заднем плане:

http://thoughtsincomputation.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. Теперь уничтожьте строки, которые мы только что создали.

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

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

1 Ответ

13 голосов
/ 01 мая 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...