¿Sabe si el uso de comillas dobles en lugar de comillas simples en ruby disminuye el rendimiento de alguna manera significativa en ruby 1.8 y 1.9.
entonces si escribo
question = 'my question'
¿Es más rápido que
question = "my question"
Me imagino que Ruby intenta averiguar si algo necesita ser evaluado cuando encuentra comillas dobles y probablemente pasa algunos ciclos haciendo eso.
ruby
performance
syntax
dimus
fuente
fuente
Respuestas:
Nota: He actualizado esto para que funcione con las versiones más nuevas de Ruby, limpié el encabezado y ejecuté el punto de referencia en un sistema más rápido.
Esta respuesta omite algunos puntos clave. Vea especialmente estas otras respuestas con respecto a la interpolación y la razón por la que no hay una diferencia significativa en el rendimiento cuando se utilizan comillas simples o dobles.
fuente
'
y"
como se analizan en la misma cosa.Resumen: sin diferencia de velocidad; Esta gran guía de estilo de colaboración Ruby recomienda ser coherente. Ahora lo uso a
'string'
menos que sea necesaria la interpolación (opción A en la guía) y me guste, pero normalmente verá más código con"string"
.Detalles:
Teóricamente, puede hacer una diferencia cuando se analiza su código , pero no solo si no le importa el tiempo de análisis en general (insignificante en comparación con el tiempo de ejecución), no podrá encontrar una diferencia significativa en este caso.
Lo importante es que cuando se ejecute será exactamente igual .
La evaluación comparativa de esto solo muestra una falta de comprensión de cómo funciona Ruby. En ambos casos, las cadenas se analizarán en a
tSTRING_CONTENT
(consulte la fuente enparse.y
). En otras palabras, la CPU realizará exactamente las mismas operaciones al crear'string'
o"string"
. Los mismos bits exactos darán la vuelta de la misma manera. La evaluación comparativa solo mostrará diferencias que no son significativas y que se deben a otros factores (activación de GC, etc.) recuerde, no puede haber ninguna diferencia en este caso! Micro puntos de referencia como estos son difíciles de acertar. Vea mi joyafruity
para una herramienta decente para esto.Tenga en cuenta que si hay una interpolación de la forma
"...#{...}..."
, esta se analiza en atSTRING_DBEG
, un montón detSTRING_DVAR
para cada expresión#{...}
y una finaltSTRING_DEND
. Sin embargo, eso es solo si hay interpolación, que no es de lo que se trata el OP.Solía sugerirle que use comillas dobles en todas partes (hace que sea más fácil agregarlas
#{some_var}
más adelante), pero ahora uso comillas simples a menos que necesite interpolación\n
, etc. Me gusta visualmente y es un poco más explícito, ya que no hay necesita analizar la cadena para ver si contiene alguna expresión.fuente
#{n}
que estaría haciendo la conversión de números). ¿No muestra las diferencias en el análisis?Sin embargo, nadie midió la concatenación frente a la interpolación:
Específicamente, tenga en cuenta
assign interp = 2.62
vsconcat single = 3.76
. Como guinda del pastel, también encuentro que la interpolación es más legible que'a' + var + 'b'
especialmente con respecto a los espacios.fuente
No hay diferencia, a menos que esté utilizando la
#{some_var}
interpolación de cadenas de estilo. Pero solo obtienes el éxito de rendimiento si realmente haces eso.Modificado del ejemplo de Zetetic :
salida
fuente
Las comillas simples pueden ser ligeramente más rápidas que las dobles porque el lexer no tiene que verificar los
#{}
marcadores de interpolación. Dependiendo de la implementación, etc. Tenga en cuenta que este es un costo de tiempo de análisis, no un costo de tiempo de ejecución.Dicho esto, la pregunta real era si el uso de cadenas dobles entre comillas "disminuye el rendimiento de alguna manera significativa", a lo que la respuesta es un decisivo "no". La diferencia en el rendimiento es tan increíblemente pequeña que es completamente insignificante en comparación con cualquier problema de rendimiento real. No pierdas tu tiempo.
La interpolación real es una historia diferente, por supuesto.
'foo'
será casi exactamente 1 segundo más rápido que"#{sleep 1; nil}foo"
.fuente
Las comillas dobles requieren el doble de golpes clave para escribir que las comillas simples. Siempre tengo prisa. Yo uso comillas simples. :) Y sí, considero que es una "ganancia de rendimiento". :)
fuente
Pensé que agregaría una comparación de 1.8.7 y 1.9.2. Los corrí algunas veces. La variación fue de aproximadamente + -0.01.
ruby 1.8.7 (2010-08-16 patchlevel 302) [x86_64-linux]
ruby 1.9.2p0 (revisión 2010-08-18 29036) [x86_64-linux]
fuente
No hay diferencia significativa en ninguna dirección. Tendría que ser enorme para que importe.
Excepto en los momentos en que esté seguro de que hay un problema real con el tiempo, optimice para mantener el programador.
Los costos del tiempo de máquina son muy muy pequeños. El costo del tiempo del programador para escribir código y mantenerlo es enorme.
¿De qué sirve una optimización para ahorrar segundos, incluso minutos de tiempo de ejecución en miles de ejecuciones si significa que el código es más difícil de mantener?
Elija un estilo y manténgalo, pero no elija ese estilo basado en milisegundos estadísticamente insignificantes de tiempo de ejecución.
fuente
También pensé que las cadenas entre comillas simples podrían ser más rápidas de analizar para Ruby. No parece ser el caso.
De todos modos, creo que el punto de referencia anterior está midiendo algo incorrecto. Es lógico pensar que cualquiera de las versiones se analizará en las mismas representaciones de cadenas internas, por lo que para obtener la respuesta sobre cuál es más rápido de analizar, no deberíamos medir el rendimiento con variables de cadena, sino más bien la velocidad de Ruby de analizar cadenas.
Las corridas repetidas no parecen hacer mucha diferencia. Todavía lleva casi el mismo tiempo analizar cualquier versión de la cadena.
fuente
Ciertamente es posible dependiendo de la implementación, pero la parte de escaneo del intérprete solo debe mirar cada personaje una vez. Solo necesitará un estado adicional (o un posible conjunto de estados) y transiciones para manejar los bloques # {}.
En un escáner basado en tablas, se realizará una búsqueda única para determinar la transición, y de todos modos sucederá para cada personaje.
Cuando el analizador obtiene la salida del escáner, ya se sabe que tendrá que evaluar el código en el bloque. Por lo tanto, la sobrecarga es solo la sobrecarga de memoria en el escáner / analizador para manejar el bloque # {}, que usted paga de cualquier manera.
A menos que me falte algo (o no recuerde los detalles de construcción del compilador), que también es posible :)
fuente
fuente
Hay uno que todos se perdieron.
AQUÍ doc
prueba esto
Me dio
y
así que ciertamente es mejor que concat y escribir todos esos put.
Me gustaría ver a Ruby enseñado más en la línea de un lenguaje de manipulación de documentos.
Después de todo, ¿no hacemos eso realmente en Rails, Sinatra y en las pruebas en ejecución?
fuente
Modifiqué la respuesta de Tim Snowhite.
Resultados:
fuente
Intenté lo siguiente:
Y estos son los resultados:
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
Si no me equivoqué, me parece que ambos toman aproximadamente el mismo tiempo, a pesar de que las citas simples son ligeramente más rápidas en la mayoría de los casos.
fuente