martes, 18 de mayo de 2010

Mini-estudio de Strings (SingleQuote vs DoubleQuote) en PHP

Leyendo el blog de Skylined, su última entrada me ha inspirado para realizar un análisis similar, en español y algo más estadístico.

Cuando programamos en PHP, podemos escribir Strings o cadenas de la siguiente forma:

$string="Esto es un simple string con comillas dobles";
o bien,
$string='Esto es un simple string con comillas simples';

Esta entrada trata de realizar un estudio o comparación entre ambos métodos.

En primer lugar hay que aclarar que la forma en que PHP destina un entrecomillado de otro es diferente. Las comillas dobles se evalúan, esto significa que se pueden emplear de la siguiente forma:

$stringconcat="string2";
$string="Esto es un string con $stringconcat";

En este ejemplo, las comillas dobles tienen primero que evaluar la variable $stringconcat y sustituir su contenido, con lo cual, realiza una evaluación, si hay más variables realizará X evaluaciones.
Sin embargo no se puede emplear (esto está mal):

$stringconcat="string2";
$string='Esto es un string con $stringconcat';

Componiendo un sencillo Script PHP que realice un determinado número de ejecuciones con diferentes tipos de Strings y almacene los resultados temporales en un fichero, tal como este:

$handle=fopen("resultado.txt","a");
for($j=1;$j<=50;$j++){
//DB sin String...
$time = microtime();
for($i=0;$i<1000;++$i){
$$i = "Un String sin un numero";
}
fwrite($handle,(microtime()-$time)."\t");
//DB sin String...
$time = microtime();
for($i=0;$i<1000;++$i){
$$i = 'Un String sin un numero';
}
fwrite($handle,(microtime()-$time)."\t");
//DB con String...
$time = microtime();
for($i=0;$i<1000;++$i){
$$i = "Un String $i con un numero";
}
fwrite($handle,(microtime()-$time)."\t");
//DQ concatenado
for($i=0;$i<1000;++$i){
$$i = "Un String ".$i." concatenado con numero";
}
fwrite($handle,(microtime()-$time)."\t");
//SQ concatenado
$time = microtime();
for($i=0;$i<1000;++$i){
$$i = 'Un String '.$i.' concatenado con numero';
}
fwrite($handle,(microtime()-$time)."\r\n");
}
fclose($handle);
echo "Terminado! Ahora importe los datos a una tabla de excel...";

Donde realizamos 50 ejecuciones, separamos entre 5 tipos de strings: Dobles Comillas (solas), Comillas simples (solas), Dobles comillas con numero, Dobles comillas con 1 concatenación y Comillas simples con 1 concatenación. Almacenamos los resultados temporales en un fichero resultado.txt. Posteriormente estos datos se importan en excel y he elaborado unas gráficas que arrojan algunos resultados interesantes.


Fig.1: Tiempos de 50 ejecuciones.


Fig.2: Promedio de 50 ejecuciones.

En estas gráficas se aprecia como las dobles comillas con una concatenación son las que mayor retardo de ejecución producen, seguido por las comillas dobles con el número. A continuación las comillas simples con una concatenación y finalmente las dobles comillas y las comillas simples.

De todo esto se deduce que las comillas simples son la mejor opción de cara al rendimiento y que en general el empleo de comillas dobles no es acertado (debido a los retardos de las evaluaciones). Sin duda, esto va a cambiar mi forma de trabajar con Strings en PHP.

Be safe ;)