2010-04-22 6 views
6

Había un pequeño debate acerca de la velocidad de fnmatch sobre pathinfo aquí: how to check if file is php?pathinfo vs fnmatch

no estaba totalmente convencido de modo decidido referencia las dos funciones.

El uso de rutas dinámicas y estáticas mostró que pathinfo era más rápido.

¿Mi lógica de comparación y conclusión son válidas?

EDITAR: El uso de php mac de cmd

PHP 5.3.0 (CLI) (construida: 20 Jul 2009 13:56:33 ) Derechos de autor (c) 1997-2009 El Grupo PHP Zend v2.3.0 motor, copyright (C) 1998-2009 Zend Tecnologías

ruta dinámica pathinfo 3,2973630428314 fnmatch 3,4520659446716 x1.05

ruta estática pathinfo ,86487698554993 fnmatch 1.0420439243317 x1.2

mac php xampp desde cmd

PHP 5.3.1 (CLI) (construido el 27 febrero 2010 12:41:51) Derechos de autor (c) 1997- 2009 El Grupo PHP Zend Engine v2.3.0, Derechos de autor (c) 1998-2009 Zend Tecnologías

ruta dinámica pathinfo 3.63922715187 4.99041700363 fnmatch x1.37

ruta estática pathinfo 1.03110480309 fnmatch 2.38929820061 x2.32

que incluyen una muestra de los resultados que están en segundos para 100.000 iteraciones en mi máquina:

dynamic path 
pathinfo 3.79311800003 
fnmatch 5.10071492195 
x1.34 

static path 
pathinfo 1.03921294212 
fnmatch 2.37709188461 
x2.29 

Código:

<pre> 
<?php 

$iterations=100000; 

// Benchmark with dynamic file path 
print("dynamic path\n"); 

$i=$iterations; 
$t1=microtime(true); 
while($i-->0){ 
    $f='/'.uniqid().'/'.uniqid().'/'.uniqid().'/'.uniqid().'.php'; 
    if(pathinfo($f,PATHINFO_EXTENSION)=='php') $d=uniqid(); 
} 
$t2=microtime(true) - $t1; 

print("pathinfo $t2\n"); 

$i=$iterations; 
$t1=microtime(true); 
while($i-->0){ 
    $f='/'.uniqid().'/'.uniqid().'/'.uniqid().'/'.uniqid().'.php'; 
    if(fnmatch('*.php',$f)) $d=uniqid(); 
} 
$t3 = microtime(true) - $t1; 

print("fnmatch $t3\n"); 

print('x'.round($t3/$t2,2)."\n\n"); 

// Benchmark with static file path 
print("static path\n"); 

$f='/'.uniqid().'/'.uniqid().'/'.uniqid().'/'.uniqid().'.php'; 

$i=$iterations; 
$t1=microtime(true); 
while($i-->0) if(pathinfo($f,PATHINFO_EXTENSION)=='php') $d=uniqid(); 
$t2=microtime(true) - $t1; 

print("pathinfo $t2\n"); 

$i=$iterations; 
$t1=microtime(true); 
while($i-->0) if(fnmatch('*.php',$f)) $d=uniqid(); 
$t3=microtime(true) - $t1; 

print("fnmatch $t3\n"); 

print('x'.round($t3/$t2,2)."\n\n"); 

?> 
</pre> 
+0

debería haber un CW ya que no es una cuestión real supongo – Gordon

+0

Es una cuestión de verdad! ¿Por qué otros llegan a una conclusión diferente? – zaf

+0

¿Cuántas veces hiciste la prueba? En máquinas multitarea, algunas tareas pueden retrasarse, ralentizando porciones de código que normalmente pueden ser más rápidas. – webbiedave

Respuesta

0

He votado pormenorizadamente todas las respuestas pero responderé a mi propia pregunta.

Mi lógica de comparación y conclusión es válida Y todos los puntos de referencia de las respuestas son válidos.

He encontrado la razón por la cual, que ha planteado otra pregunta, pero haciendo que esta publicación se dispare en una tangente y lo haga aún más, abriré otra pregunta. Pondré el nuevo enlace aquí cuando lo haya hecho.

Gracias por la evaluación comparativa para mí!

EDIT: aquí está la pregunta parte 2: (Pathinfo vs fnmatch part 2) Speed benchmark reversed on Windows and Mac

1

Mis resultados son opuestos de los suyos:

php -f 2693428.php 
dynamic path 
pathinfo 4.5834331512451 
fnmatch 3.2174317836761 
x0.7 

static path 
pathinfo 2.1787130832672 
fnmatch 0.95714497566223 
x0.44 

Versión

PHP 5.3.0 (cli) (built: Jun 29 2009 21:25:23) 
Copyright (c) 1997-2009 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies 
1

Ejecución de la suya con

PHP 5.3.2 (cgi-fcgi) (built: Mar 3 2010 20:47:00) 
Copyright (c) 1997-2010 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies 
with Zend Debugger v5.3, Copyright (c) 1999-2010, by Zend Technologies 

da

dynamic path 
pathinfo 3.4931519031525 
fnmatch 2.8633069992065 
x0.82 

static path 
pathinfo 0.83261299133301 
fnmatch 0.28636598587036 
x0.34 

Estos cuatro

function hasExtension1($ext, $filename) 
{ 
    return !strcasecmp(pathinfo($filename, PATHINFO_EXTENSION), $ext); 
} 

function hasExtension2($ext, $filename) 
{ 
    return fnmatch("*.$ext", $filename, FNM_CASEFOLD); 
} 

function hasExtension3($ext, $filename) 
{ 
    return strripos($filename, $ext) === strlen($filename) - strlen($ext); 
} 

function hasExtension4($ext, $filename) 
{ 
    return !strcasecmp(substr($filename, -strlen($ext)), $ext); 
} 

cuando se ejecuta como esto

for($i=0;$i<10000;$i++) hasExtension1('php', __FILE__); 
for($i=0;$i<10000;$i++) hasExtension2('php', __FILE__); 
for($i=0;$i<10000;$i++) hasExtension3('php', __FILE__); 
for($i=0;$i<10000;$i++) hasExtension4('php', __FILE__); 

y perfiladas en mi máquina de Zend Studio doy

Average Mean Time = 0.000007 
Average Mean Time = 0.000006 
Average Mean Time = 0.000005 
Average Mean Time = 0.000003 

Me parece un poco molesto que hay 4 es más rápido, pero eso es lo que dice. Y con 0.00000n segundos por llamada, no es nada que moleste de todos modos.

1

Utilizando el mismo código de la evaluación comparativa

dynamic path 
pathinfo 2.6542711257935 
fnmatch 1.9943950176239 
x0.75 

static path 
pathinfo 1.1711349487305 
fnmatch 0.54186105728149 
x0.46 

PHP Version 5.3.1 
Build Date Nov 20 2009 17:20:57 
Compiler MSVC6 (Visual C++ 6.0) 
Architecture x86 
Thread Safety enabled 
Zend Memory Manager enabled 
Zend Multibyte Support disabled 
1

voy a tirar mis resultados aquí:

dynamic path 
pathinfo 4.9078891277313 
fnmatch 4.3466200828552 
x0.89 

static path 
pathinfo 1.4787950515747 
fnmatch 0.98351812362671 
x0.67 

pero tenga en cuenta mi comentario original sobre la cuestión se ha vinculado a:

Con respecto a la velocidad, fnmatch saldrá realiza pathinfo 2: 1 cuando se usa para este propósito.

Específico para la bifurcación en una extensión particular.

Cuestiones relacionadas