Concatenación de cadenas, again
Enviado por clbustos el Vie, 15/04/2005 - 15:39.
Clasificado en:
Leo en la bitácora de Guti el artículo Composición de cadenas. Ya había tocado el tema, pero mi carácter anal(Freüd, señores, Freüd), me impone hacer algunas observaciones:
- La primera,
está malla forma de calcular el microtime con true es sólo válida para php5. Es una cadena en php4, así que primero hay que pasarla a número, para compatibilidad - Los códigos no son equivalentes, ya que en la primera comprobación no se le agrega nada a $sTest después de la segunda línea y en el código de la comprobación estática se ocupa el retorno de línea como el separador. Se que en web no se nota, pero anda a hacer lo mismo en un archivo PDF; por eso, hago el str_replace al final de cada ciclo.
- function getmicrotime() {
- list($usec, $sec) = explode(" ", microtime());
- return ((float)$usec+(float)$sec);
- }
- // versión concatenada
- $fInicio = getmicrotime();
- for ($iCont = 0;$iCont<50000;$iCont++) {
- $sTest = '1234567890 1234567890 ';
- $sTest.= '1234567890 1234567890 ';
- $sTest.= '1234567890 1234567890 ';
- $sTest.= '1234567890 1234567890 ';
- $sTest.= '1234567890 1234567890 ';
- $sTest.= '1234567890 1234567890 ';
- $sTest.= '1234567890 1234567890 ';
- $sTest.= '1234567890 1234567890 ';
- $sTest.= '1234567890 1234567890 ';
- $sTest.= '1234567890 1234567890 ';
- }
- $fFin = getmicrotime();
- echo 'Tiempo Concatenación: '.($fFin-$fInicio) .'<br>';
- $fInicio = getmicrotime();
- for ($iCont = 0;$iCont<50000;$iCont++) {
- ob_start();
- echo '1234567890 1234567890 ';
- echo '1234567890 1234567890 ';
- echo '1234567890 1234567890 ';
- echo '1234567890 1234567890 ';
- echo '1234567890 1234567890 ';
- echo '1234567890 1234567890 ';
- echo '1234567890 1234567890 ';
- echo '1234567890 1234567890 ';
- echo '1234567890 1234567890 ';
- echo '1234567890 1234567890 ';
- $sTest=ob_get_contents();
- ob_end_clean();
- }
- $fFin = getmicrotime();
- echo 'Tiempo Ob: '.($fFin-$fInicio) .'<br>';
- $fInicio = getmicrotime();
- 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 ';
- $sTest = str_replace("\n", "", $sTest);
- }
- $fFin = getmicrotime();
- echo 'Tiempo: '.($fFin-$fInicio) .'<br>';
El resultado es el siguiente:
- Tiempo Concatenación: 0.50940585136414
- Tiempo Ob: 1.3022680282593
- Tiempo estático: 0.6776008605957
- 3395 lecturas

1) El microtime en ese formato, es válido en PHP 5 y superiores; y el parámetro asignado en ese caso a true, significa get as float.
2) De acuerdo en este punto; en la primera iteración no se concatena, por lo que la diferencia de rendimiento debe ser todavía más acusada.
Jejeje. Bien. Toda la razón con microtime (eso me pasa por no actualizar el manual en la pega).
Sobre lo segundo, claro, hay que hacer las pruebas equivalentes.
Ahora bien, cuando se tienen textos grandes a concatenar, el buffer de salida es la mejor opción, ya que php asigna 40k de memoria para la salida.
yo hice similares, solo por curiosidad, para saber la diferencia entre usar (en ADO) stored procedures, y recodsets.
Pero solo por hacer la puñeta un pelin ¿qué pasa con el tiempo de ejecución de "getmicrotime"?
Enviar un comentario nuevo