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:

  1. La primera, está mal la 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
  2. 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.
Tomando en cuenta esto y agregando las funciones de buffer de salida, ofrezco una versión nueva del mismo comprobador de tiempo
  1.  <?php
  2.   function getmicrotime() {
  3.   list($usec, $sec) = explode(" ", microtime());
  4.   return ((float)$usec+(float)$sec);
  5.   }
  6.   // versión concatenada
  7.   $fInicio = getmicrotime();
  8.   for ($iCont = 0;$iCont<50000;$iCont++) {
  9.   $sTest = '1234567890 1234567890 ';
  10.   $sTest.= '1234567890 1234567890 ';
  11.   $sTest.= '1234567890 1234567890 ';
  12.   $sTest.= '1234567890 1234567890 ';
  13.   $sTest.= '1234567890 1234567890 ';
  14.   $sTest.= '1234567890 1234567890 ';
  15.   $sTest.= '1234567890 1234567890 ';
  16.   $sTest.= '1234567890 1234567890 ';
  17.   $sTest.= '1234567890 1234567890 ';
  18.   $sTest.= '1234567890 1234567890 ';
  19.   }
  20.   $fFin = getmicrotime();
  21.   echo 'Tiempo Concatenación: '.($fFin-$fInicio) .'<br>';
  22.   $fInicio = getmicrotime();
  23.   for ($iCont = 0;$iCont<50000;$iCont++) {
  24.   ob_start();
  25.   echo '1234567890 1234567890 ';
  26.   echo '1234567890 1234567890 ';
  27.   echo '1234567890 1234567890 ';
  28.   echo '1234567890 1234567890 ';
  29.   echo '1234567890 1234567890 ';
  30.   echo '1234567890 1234567890 ';
  31.   echo '1234567890 1234567890 ';
  32.   echo '1234567890 1234567890 ';
  33.   echo '1234567890 1234567890 ';
  34.   echo '1234567890 1234567890 ';
  35.   $sTest=ob_get_contents();
  36.   ob_end_clean();
  37.   }
  38.   $fFin = getmicrotime();
  39.   echo 'Tiempo Ob: '.($fFin-$fInicio) .'<br>';
  40.   $fInicio = getmicrotime();
  41.   for ($iCont = 0;$iCont<50000;$iCont++) {
  42.   $sTest = '1234567890 1234567890
  43.   1234567890 1234567890
  44.   1234567890 1234567890
  45.   1234567890 1234567890
  46.   1234567890 1234567890
  47.   1234567890 1234567890
  48.   1234567890 1234567890
  49.   1234567890 1234567890
  50.   1234567890 1234567890
  51.   1234567890 1234567890 ';
  52.   $sTest = str_replace("\n", "", $sTest);
  53.   }
  54.   $fFin = getmicrotime();
  55.   echo 'Tiempo: '.($fFin-$fInicio) .'<br>';
  56.  ?>

El resultado es el siguiente:

  • Tiempo Concatenación: 0.50940585136414
  • Tiempo Ob: 1.3022680282593
  • Tiempo estático: 0.6776008605957
Nice, no es cierto?
Imagen de Guti

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.

Enviado por Guti (no verificado) el Vie, 15/04/2005 - 19:00.
Imagen de clbustos

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.

Enviado por clbustos el Vie, 15/04/2005 - 19:32.
Imagen de Albin

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"?

Enviado por Albin (no verificado) el Sáb, 16/04/2005 - 03:40.

Enviar un comentario nuevo

El contenido de este campo se mantiene como privado y no se muestra públicamente.
If you have a Gravatar account, used to display your avatar.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato