Были маленькие дебаты относительно скорости fnmatch по pathinfo здесь: как проверить, является ли файл php?
Я не был полностью убежден так решенный для сравнительного тестирования двух функций.
Используя динамические и статические пути показал, что pathinfo был быстрее.
Допустимы моя логика сравнительного тестирования и заключение?
Править: Используя Mac php от cmd
PHP 5.3.0 (cli) (созданный: 20 июля 2009 13:56:33) Copyright (c) 1997-2009 The PHP Group Механизм Zend v2.3.0, Copyright (c) 1998-2009 Zend Technologies
динамический pathinfo 3.2973630428314 fnmatch 3.4520659446716 x1.05 пути
статический pathinfo 0.86487698554993 fnmatch 1.0420439243317 x1.2 пути
Mac xampp php от cmd
PHP 5.3.1 (cli) (созданный: 27 февраля 2010 12:41:51) Copyright (c) 1997-2009 The PHP Group Механизм Zend v2.3.0, Copyright (c) 1998-2009 Zend Technologies
динамический pathinfo 3.63922715187 fnmatch 4.99041700363 x1.37 пути
статический pathinfo 1.03110480309 fnmatch 2.38929820061 x2.32 пути
Я включаю образец результатов, которые находятся в секундах для 100 000 повторений на моей машине:
dynamic path
pathinfo 3.79311800003
fnmatch 5.10071492195
x1.34
static path
pathinfo 1.03921294212
fnmatch 2.37709188461
x2.29
Код:
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");
?>
Я проголосовал за все ответы, но отвечу на свой вопрос.
Логика и выводы моего бенчмарка верны И все ответы бенчмарка верны.
Я нашел причину, которая вызвала другой вопрос, но вместо того, чтобы заставлять этот пост идти по касательной и делать его еще длиннее, я открою другой вопрос. Я размещу здесь новую ссылку, когда сделаю это.
Спасибо за бенчмаркинг для меня!
EDIT: вот вопрос части 2: (Pathinfo vs fnmatch часть 2) Сравнение скорости на Windows и Mac
Мои результаты противоположны вашим:
php -f 2693428.php
dynamic path
pathinfo 4.5834331512451
fnmatch 3.2174317836761
x0.7
static path
pathinfo 2.1787130832672
fnmatch 0.95714497566223
x0.44
Версия
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
Используя тот же тестовый код
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
Запуск вашего с
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
дает
dynamic path
pathinfo 3.4931519031525
fnmatch 2.8633069992065
x0.82
static path
pathinfo 0.83261299133301
fnmatch 0.28636598587036
x0.34
Эти четыре
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);
}
, когда запускаются таким образом
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__);
и профилированы на моей машине из Zend Studio, дают
Average Mean Time = 0.000007
Average Mean Time = 0.000006
Average Mean Time = 0.000005
Average Mean Time = 0.000003
Меня несколько раздражает то, что № 4 - самый быстрый, но это то, что он говорит. И с 0.00000n секунд на звонок, в любом случае не о чем беспокоиться.
Я добавлю сюда свои результаты:
dynamic path
pathinfo 4.9078891277313
fnmatch 4.3466200828552
x0.89
static path
pathinfo 1.4787950515747
fnmatch 0.98351812362671
x0.67
Но не забывайте мой первоначальный комментарий по вопросу, на который вы ссылаетесь:
Что касается скорости, fnmatch будет out выполняет pathinfo 2: 1 при использовании для этой цели.
Специфично для ветвления на определенном расширении.