¡¿Los símbolos de Ruby no se recogen basura? Entonces, ¿no es mejor usar una cadena?

Si crea 10.000 cadenas en un bucle, se debe llevar a cabo una gran cantidad de recolección de basura que consume una gran cantidad de recursos.

Si haces lo mismo con los símbolos, creas objetos que no pueden ser recolectados como basura .

¿Qué es peor?

Si se refiere al mismo símbolo en su bucle, entonces no tiene que recrear ese objeto cada vez, es decir,

while i < 10000 i += 1 :im_using_this_symbol_here end 

Ahora, si usa una cadena allí, la cadena se volverá a crear 10K veces. En general, use símbolos en los casos en que casi trate el literal como una constante o una clave. Un muy buen ejemplo para mí sería

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

en lugar de

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

Acción reutilizada una y otra vez dentro de su aplicación.

Al ver que los símbolos casi siempre se crean a través de literales, no hay mucho potencial para una explosión de memoria aquí. Su comportamiento es bastante requerido por su uso: cada vez que se refiere a un símbolo, es el mismo.

Del mismo modo, las cadenas deben ser únicas en Ruby. Esto se debe a la forma en que se utilizan: procesamiento de texto, etc.

Decida cuál usar dependiendo de su semántica, no optimice prematuramente.

Si está utilizando Ruby 2.2.0 o posterior, normalmente debería estar bien crear dinámicamente muchos símbolos, ya que se recolectarán de acuerdo con el anuncio de Ruby 2.2.0-preview1 , que contiene un enlace a más detalles sobre el Nuevo símbolo GC . Sin embargo, si pasa sus símbolos dynamics a algún tipo de código que lo convierte en una ID (un concepto interno de implementación de Ruby utilizado en el código fuente de C), en ese caso se fijará y nunca se recogerá la basura. No estoy seguro de qué tan comúnmente sucede eso.

Al decidir si usar símbolos o cadenas debe considerar:

  • Los símbolos no se pueden cambiar después de crearlos.
  • Los símbolos no tienen muchos de los métodos que tienen las cadenas, como start_with?
  • Los símbolos pueden compararse muy eficientemente entre sí para la igualdad.
  • Se supone que los símbolos representan el nombre de algo de acuerdo con los documentos de Symbol . No los usaría para almacenar nada que no pudiera ser considerado un nombre.