Muchas veces componemos cadenas de texto estático en nuestras aplicaciones.
Si son largas, es una buena práctica dividirla en varias lineas de código fuente, haciendo más legible el contenido de la variable.
El problema es que solemos utilizar el operador de concatenación para unir las diferentes lineas en una sola cadena, y esto obliga a que la máquina deba ejecutar la concatenación, lo que hace que sea poco eficiente.
Es lógico, la concatenación de cadenas está pensada para realizar esta operación en tiempo de ejecución; por eso la mayoría de lenguajes permiten unir trozos de cadenas estáticas en tiempo de compilación.
En el caso concreto de PHP, podemos evitar el ineficiente:
$a='1234567890';
$a=$a . '1234567890';
…
Reemplazándolo por un:
$a='1234567890
1234567890
…
';
Para comprobar las diferencias en cuanto a rendimiento, he aquí el siguiente código:
<?php
$fInicio=microtime(true);
for ($iCont=0; $iCont<50000; $iCont++)
{
$sTest='1234567890 1234567890 ';
$sTest . $sTest . '1234567890 1234567890 ';
$sTest . $sTest . '1234567890 1234567890 ';
$sTest . $sTest . '1234567890 1234567890 ';
$sTest . $sTest . '1234567890 1234567890 ';
$sTest . $sTest . '1234567890 1234567890 ';
$sTest . $sTest . '1234567890 1234567890 ';
$sTest . $sTest . '1234567890 1234567890 ';
$sTest . $sTest . '1234567890 1234567890 ';
$sTest . $sTest . '1234567890 1234567890 ';
}
$fFin=microtime(true);
echo 'Tiempo: ' . ($fFin-$fInicio) . '<br>';
$fInicio=microtime(true);
for ($iCont=0; $iCont<50000; $iCont++)
{
$sTest='1234567890 1234567890
1234567890 1234567890
1234567890 1234567890
1234567890 1234567890
1234567890 1234567890
1234567890 1234567890
1234567890 1234567890
1234567890 1234567890
1234567890 1234567890
1234567890 1234567890 ';
}
$fFin=microtime(true);
echo 'Tiempo: ' . ($fFin-$fInicio) . '<br>';
?>
Y estos son los resultados, tras ejecutarlo en mi Athlon XP 2400 con PHP 5.0.4:
Método: | Tiempo: | Diferencia: |
Concatenando (.): | 0,32 segundos | 100 % |
Sin concatenar: | 0,05 segundos | 640 % |
6 veces más rápido si evitamos la concatenación. ¿Está claro, verdad?
mmmmmmmmmm…. me ha gustado, si señor. Pijadas de este tipo me dedico yo continuamente jeje
Muy interesante, lo tendré en cuenta 🙂
Pero en el caso que no utilizas la concatenación, estás metiendo saltos de línea… por lo que el string no es el mismo, está claro que si el string lleva saltos de línea aprovechar y meterlo como en el segundo caso…