Categorías
Tecnologia

Comparativa de velocidad de preg_replace

Hoy he tenido que decidir si utilizaba los parámetros de la función preg_replace de PHP en su variedad ‘array’ o en su forma de cadena de texto. La única duda que tenía acerca de las dos formas de usar la función era cual era más rápida. Intuitivamente, me daba la impresión de que utilizarla en forma de matriz iba a ser más eficiente, pero hay que comprobarlo.

Básicamente la comparación que quería hacer era saber si es mejor llamar a preg_replace varias veces o si es preferible pasarle en sus dos primeros parámetros sendas matrices con la sustitución a realizar.

Para comprobarlo, he utilizado una clase Cronómetro y he creado dos funciones, cada una con su forma de llamar a la función:

function testA() {
  $str = 'xxxHxxx';
  for ($i = 0;  $i < ITERACIONES;  $i++) {
    $str = preg_replace("/(H+)/", '\1H', $str);
  }
}

function testB() {
  $str = 'xxxHxxx';
  $r1 = array();
  $r2 = array();
  for ($i = 0;  $i < ITERACIONES;  $i++) {
    $r1[] = "/(H+)/";
    $r2[] = '\1H';
  }
  $str = preg_replace($r1, $r2, $str);
}

Según el número de iteraciones, los tiempos medios que han devuelto las ejecuciones han sido:

100 iteraciones: A=0,0029  B=0,0005
1000 iteraciones: A=0,0284  B=0,0052
10000 iteraciones: A=0,3775 B=0,1322
100000 iteraciones: A=13,4237 B=10,0201

Se podría incluso dibujar una bonita gráfica con estos datos. El caso es que se confirma la hipótesis inicial por la cual se suponía que si existe una versión matricial para llamar a una función, lo lógico sería que esta versión fuera más óptima.

Sin embargo, este resultado también nos indica que si la carga de llamadas a la función va a ser baja (fuera de un bucle interno o en páginas con poco tráfico, por ejemplo) el uso de una versión u otra de la función tampoco es muy importante. Evidentemente, siempre que sea posible trataremos de utilizar la función matricial, pero si ello implica tener que reorganizar mucho código o cambiar interfaces de funciones ya definidos, quizá nos interese más dejarlo tal cual está (¿que son 2 milésimas de segundo en el proceso total de carga de una página?).

En caso de que nuestra función ejecute un gran número de sustituciones o si se va a ejecutar muchas veces porque se encuentra en un bucle principal del programa, utilizaremos la segunda versión de la función que se ha demostrado más eficiente en todos los casos probados.

Como se puede observar el incremento en tiempo de ejecución de ambas funciones no es lineal, por lo que se debe tener cuidado a la hora de utilizarlas con un número excesivamente elevado de patrones. Por último comentar que la expresión regular utilizada para realizar la sustitución es muy simple debido a que la intención de esta comparación no es comprobar el poder de las expresiones regulares, sino la eficiencia a la hora de utilizar uno u otro método para enviar los parámetros.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *