2010-04-22 2 views
6

Il y avait un petit débat sur la vitesse de fnmatch sur pathinfo ici: how to check if file is php?pathinfo vs fnmatch

je ne suis pas totalement convaincu donc décidé de comparer les deux fonctions. L'utilisation de chemins dynamiques et statiques a montré que pathinfo était plus rapide.

Ma logique de benchmarking et ma conclusion sont-elles valables?

EDIT: Utilisation de mac php de cmd

PHP 5.3.0 (cli) (construction: 20 juillet 2009 13:56:33) Copyright (c) 1997-2009 Le groupe PHP Zend Engine v2.3.0 Copyright (c) 1998-2009 Zend Technologies

chemin dynamique pathinfo 3,2973630428314 fnmatch 3,4520659446716 x1.05

chemin statique pathinfo ,86487698554993 fnmatch 1,0420439243317 x1.2

mac xampp php de cmd

PHP 5.3.1 (cli) (construite: 27 février 2010 12:41:51) Copyright (c) 1997- 2009 Le moteur PHP Group Zend v2.3.0 Copyright (c) 1998-2009 Zend Technologies

chemin dynamique pathinfo 3,63922715187 fnmatch 4,99041700363 x1.37

chemin statique pathinfo 1.03110480309 fnmatch 2.38929820061 x2.32

I comprennent un échantillon des résultats qui sont en quelques secondes pour 100.000 itérations sur ma machine:

dynamic path 
pathinfo 3.79311800003 
fnmatch 5.10071492195 
x1.34 

static path 
pathinfo 1.03921294212 
fnmatch 2.37709188461 
x2.29 

code:

<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

devrait être une CW puisque ce n'est pas une vraie question, je suppose – Gordon

+0

Il est une vraie question! Pourquoi les autres arrivent-ils à une conclusion différente? – zaf

+0

Combien de fois avez-vous exécuté le test? Sur les machines multitâches, certaines tâches peuvent être retardées, ce qui ralentit les portions de code qui peuvent normalement être plus rapides. – webbiedave

Répondre

0

J'ai upvoted toutes les réponses, mais répondra à ma propre question.

Ma logique de benchmarking et de conclusion est valide ET tous les repères de réponses sont valides.

J'ai trouvé la raison pour laquelle, ce qui a soulevé une autre question, mais plutôt faire ce message en tangente et le rendre encore plus long, je vais ouvrir une autre question. Je vais mettre le nouveau lien ici quand je l'ai fait.

Merci pour l'analyse comparative pour moi!

EDIT: voici la partie 2 question: (Pathinfo vs fnmatch part 2) Speed benchmark reversed on Windows and Mac

1

Mes résultats sont à l'opposé de la vôtre:

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

static path 
pathinfo 2.1787130832672 
fnmatch 0.95714497566223 
x0.44 

Version

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

Courir à vous avec

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 

donne

dynamic path 
pathinfo 3.4931519031525 
fnmatch 2.8633069992065 
x0.82 

static path 
pathinfo 0.83261299133301 
fnmatch 0.28636598587036 
x0.34 

Ces quatre

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); 
} 

lorsqu'il est exécuté comme ce

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__); 

et PROFILES sur ma machine de Zend Studio donne

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

Je trouve un peu ennuyeux que n ° 4 est le plus rapide, mais c'est ce qu'il dit. Et avec 0.00000n secondes par appel, ça ne dérange pas de toute façon.

1

En utilisant le même code d'étalonnage

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

Je vais jeter mes résultats ici:

dynamic path 
pathinfo 4.9078891277313 
fnmatch 4.3466200828552 
x0.89 

static path 
pathinfo 1.4787950515747 
fnmatch 0.98351812362671 
x0.67 

Mais gardez à l'esprit mon commentaire original sur la question que vous avez lié à:

En ce qui concerne la vitesse, fnmatch va sortir effectuer pathinfo 2: 1 lorsqu'il est utilisé pour ce but.

Spécifique à la ramification sur une extension particulière.