Рубиновые символы не являются мусором !? Тогда не лучше ли использовать строку? - PullRequest
10 голосов
/ 18 марта 2009

Если вы создаете 10000 строк в цикле, необходимо собрать много мусора, который потребляет много ресурсов.

Если вы делаете то же самое с символами, вы создаете объекты, которые нельзя собрать мусором .

Что хуже?

Ответы [ 3 ]

9 голосов
/ 19 марта 2009

Если вы ссылаетесь на один и тот же символ в вашем цикле, то нет необходимости каждый раз воссоздавать этот объект, т.е.

while i < 10000
  i += 1
  :im_using_this_symbol_here
end

Теперь, если вместо этого вы используете строку, строка будет воссоздана 10K раз. В общем, используйте символы в тех случаях, когда вы почти рассматриваете литерал как константу или ключ. Очень хорошим примером для меня будет

link_to "News", :action => 'news'

вместо

link_to "News", "action" => 'news'

действие снова и снова используется в вашем приложении.

7 голосов
/ 18 марта 2009

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

Аналогично, строки должны быть уникальными в Ruby. Это связано с тем, как они используются - обработка текста и т. Д.

Решите, какой из них использовать в зависимости от их семантики, не оптимизируйте преждевременно.

6 голосов
/ 25 сентября 2014

Если вы используете Ruby 2.2.0 или более позднюю версию, обычно можно нормально создавать большое количество символов, поскольку они будут собираться мусором в соответствии с объявлением Ruby 2.2.0-preview1 , который имеет ссылку на более подробную информацию о новом символе GC . Однако, если вы передадите свои динамические символы в какой-то код, который преобразует его в идентификатор (внутренняя концепция реализации Ruby, используемая в исходном коде C), тогда в этом случае он будет закреплен и никогда не будет собирать мусор. Я не уверен, как часто это происходит.

При принятии решения, использовать ли символы или строки, следует учитывать:

  • Символы не могут быть изменены после их создания.
  • Символы не имеют большого количества методов, которые есть в строках, например start_with?
  • Символы можно очень эффективно сравнить друг с другом на равенство.
  • Символы должны представлять имя чего-либо в соответствии с Символом документа . Я бы не использовал их для хранения чего-либо, что не могло бы считаться именем.
...