scientific - Desempeño de la expansión variable vs. sprintf en PHP
printf w3schools (5)
En todos los casos, el segundo no será más rápido, ya que está suministrando una cadena de comillas dobles, que también deben analizarse para las variables. Si vas a micro-optimización, la forma correcta es:
$message = sprintf(''The request %s has %d errors'', $request, $n);
Aún así, creo que los segundos son más lentos (ya que @Pekka señaló que la diferencia realmente no importa), debido a la sobrecarga de una llamada de función, una cadena de análisis, la conversión de valores, etc. Pero tenga en cuenta que las 2 líneas de código no son equivalente, ya que en el segundo caso $ n se convierte a entero. si $ n es "sin error", la primera línea mostrará:
The request $request has no error errors
Mientras que la segunda dará salida:
The request $request has 0 errors
En cuanto al rendimiento, ¿hay alguna diferencia entre hacer:
$message = "The request $request has $n errors";
y
$message = sprintf(''The request %s has %d errors'', $request, $n);
en PHP?
Yo diría que llamar a una función implica más cosas, pero no sé qué hace PHP detrás de escena para expandir los nombres de las variables.
¡Gracias!
Finalmente, el primero es el más rápido cuando se considera el contexto de una asignación de una sola variable que se puede ver al observar varios puntos de referencia. Tal vez, sin embargo, el uso de la funcionalidad sprintf de las funciones principales de PHP podría permitir un código más extensible y estar mejor optimizado para los mecanismos de caché a nivel de bytecode como opcache o apc. En otras palabras, una aplicación de tamaño particular podría usar menos código al utilizar el método sprintf. Cuanto menos código tenga que almacenar en la memoria caché en la RAM, más RAM tendrá para otras cosas o más scripts. Sin embargo, esto solo importa si sus scripts no encajarían correctamente en la RAM utilizando la evaluación.
No importa.
Cualquier ganancia de rendimiento sería tan minúscula que la vería (como una mejora en los cientos de segundos) solo con 10000 o 100000 de iteraciones, si es que incluso entonces.
Para números específicos, vea este punto de referencia . Puede ver que tiene que generar 1 MB + de datos utilizando 100,000 llamadas a funciones para lograr una diferencia medible en cientos de milisegundos. Apenas una situación de la vida real. Incluso el método más lento ("sprintf () con parámetros posicionales") toma solo 0.00456 milisegundos contra 0.00282 milisegundos con el más rápido. Para cualquier operación que requiera 100.000 llamadas de salida de cadena, tendrá otros factores (tráfico de red, por ejemplo) que serán un orden de ampliación más lento que los 100 ms que puede ahorrar al optimizar esto.
Use lo que haga que su código sea más fácil de leer y mantener para usted y para otros. Para mí, personalmente, el método sprintf()
es una buena idea, tengo que pensar en comenzar a usar eso yo mismo.
Para inyectar varias variables de cadena en una cadena, la primera será más rápida.
$message = "The request $request has $n errors";
Y para una sola inyección, la concatenación de puntos (.) Será más rápida.
$message = ''The request ''.$request.'' has 0 errors'';
Haga la iteración con un bucle de mil millones y encuentre la diferencia.
Por ejemplo:
<?php
$request = "XYZ";
$n = "0";
$mtime = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
$message = "The request {$request} has {$n} errors";
}
$ctime = microtime(true);
echo ($ctime-$mtime);
?>
Aquí se realizó un análisis de rendimiento sobre "expansión variable vs. sprintf".
Como dice @pekka, "hace que su código sea más legible y mantenible para usted y para otros". Cuando las ganancias de rendimiento son "bajas" (~ menos de dos veces), ignórelas.
Resumiendo el punto de referencia : PHP está optimizado para resoluciones de doble cita y Heredoc. Porcentajes con respecto al tiempo promedio, para calcular una cadena muy larga usando solo,
- Resolución de doble cita: 75%
- Resolución heredoc: 82%
- concatenación de una sola cita: 93%
- Formación de sprintf: 117%.
- Formación de sprintf con parámetros indexados: 133%
Tenga en cuenta que solo el sprintf realiza alguna tarea de formateo (consulte el índice de referencia ''% s% s% d% s% f% s''), y como lo muestra @Darhazer, hace alguna diferencia en la salida. Una mejor prueba son dos puntos de referencia, uno solo que compara los tiempos de concatenación (formateador ''% s''), otro que incluye el proceso de formateo, por ejemplo ''% 3d% 2.2f'' y equivalentes funcionales antes de expandir las variables en comillas dobles ... Y más uno Combinación de referencia utilizando cadenas cortas de plantillas.
Pros y contras
La principal ventaja de sprintf
es, como lo muestran los puntos de referencia, el formateador de muy bajo costo (!). Para plantillas genéricas sugiero el uso de la función vsprintf .
Las principales ventajas de las citas dobles (y heredoc) son algunos resultados; y cierta legibilidad y capacidad de mantenimiento de los marcadores de posición nominales, que crece con el número de parámetros (después de 1), cuando se compara con las marcas posicionales de sprintf.
El uso de marcadores de posición indexados se encuentra en la mitad del mantenimiento con Sprintf.
NOTA: no utilice concatenación de comillas simples , solo si es realmente necesario. Recuerde que PHP habilita la sintaxis segura, como "Hello {$user}_my_brother!"
, y referencias como "Hello {$this->name}!"
.