2012-08-08 14 views
5

Me pregunto. ¿Hay un mejor rendimiento con esto:¿Usar una matriz es más rápido que tener múltiples instrucciones?

$value = preg_replace(array('/_{1,}/', '/-{2,}/'), array('_', '-'), $value); 

que esto:

$value = preg_replace('/_{1,}/', '_', $value); 
$value = preg_replace('/-{2,}/', '-', $value); 

Esto es sólo un ejemplo muy sencillo.

+7

Dos palabras: el perfil it. – deceze

+1

'$ start = microtime (verdadero); // tu codigo; echo microtime (true) - $ start; '. Repita varias veces y vea el resultado. – Leri

+0

Estoy en eso. Dame un minuto. :) – insertusernamehere

Respuesta

3

Como mi código de prueba:

$value = 'dfkjgnnfdjgnjnfdkgn dnf gnjknkxvjn jkngjsrgn'; 
$value1 = 'dfkjgnnfdjgnjnfdkgn dnf gnjknkxvjn jkngjsrgn'; 

$start = microtime(true); 
for ($i = 0; $i < 1000000; $i++) 
$value = preg_replace(array('/_{1,}/', '/-{2,}/'), array('_', '-'), $value); 
echo microtime(true) - $start.'<br>'; 

$start1 = microtime(true); 
for ($i = 0; $i < 1000000; $i++){ 
    $value1 = preg_replace('/_{1,}/', '_', $value1); 
    $value1 = preg_replace('/-{2,}/', '-', $value1); 
} 
echo microtime(true) - $start1; 

1,4254899024963

1,2811040878296

+0

Muchas gracias por su esfuerzo. – insertusernamehere

+2

@insertusernamehere De nada. Por cierto, me ayudaste mucho. Optimicé una pequeña parte de mi proyecto que me dio una diferencia de casi medio segundo que es realmente valiosa en la situación actual. Gracias a ti también. – Leri

+1

Nice SO coincidencias. :) – insertusernamehere

2

Usando el método de prueba microtime() que la RLF se menciona en los comentarios, usted está buscando en torno una diferencia de 0.3 segundos en el rendimiento. El segundo ejemplo es "más rápido".

+0

Basado en qué? Intenté hacer una prueba y la segunda es más rápida. –

+0

Edité mi respuesta para corregir un error de lógica en mi prueba. Esto está usando la función microtime para hacer eco de los tiempos de ejecución. El segundo es más rápido alrededor de .3 segundos. –

+0

Hmm ok, de nada ;-) –

1

Para seguir el llamado creé un muy corto ejemplo en el que la sustitución tiene algo que ver:

$value = '1_2__3___4____5_____6______1-2--3---4----5-----6------'; 

$s_1 = microtime(true); 
    for ($i = 0; $i < 1000000; ++$i) { 
     $r_1 = preg_replace(array('/_{2,}/', '/-{2,}/'), array('_', '-'), $value); 
    } 
$e_1 = microtime(true); 

$s_2 = microtime(true); 
    for ($i = 0; $i < 1000000; ++$i) { 
     $r_2 = preg_replace('/_{2,}/', '_', $value); 
     $r_2 = preg_replace('/-{2,}/', '-', $r_2); 
    } 
$e_2 = microtime(true); 

print $r_1; 
print $r_2; 
print $e_1 - $s_1; 
print $e_2 - $s_2; 

Con este resultado:

3,69554805756

3,2879319191

Como se esperaba, no hay una diferencia significativa - en realidad no hay diferencia en absoluto - ya que estamos hablando de un millón de llamadas. También es interesante que la segunda versión sea "un poco" más rápida. Supongo que es porque crear y ejecutar esas matrices.

+0

Si su patrón es más complejo que este ejemplo, eche un vistazo al 'S' (estudio) [modificador] (http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php) –

+0

Esto suena interesante para problemas realmente complejos. Gracias por ese consejo. – insertusernamehere

0

Es interesante observar que ejecuté las dos secuencias de comandos y en mi caso las que tenían las matrices fueron más rápidas.

primera prueba

2,0891699790955

2,2491400241852


segunda prueba

3,2192239761353

3,4498269557953


Sistema

PHP: 5.4.9

OS: Ubuntu x64

CPU: i7-3630QM

Cuestiones relacionadas