pathinfo по сравнению с fnmatch

Были маленькие дебаты относительно скорости 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");

?>

7
задан fish2000 29 April 2019 в 18:52
поделиться

5 ответов

Я проголосовал за все ответы, но отвечу на свой вопрос.

Логика и выводы моего бенчмарка верны И все ответы бенчмарка верны.

Я нашел причину, которая вызвала другой вопрос, но вместо того, чтобы заставлять этот пост идти по касательной и делать его еще длиннее, я открою другой вопрос. Я размещу здесь новую ссылку, когда сделаю это.

Спасибо за бенчмаркинг для меня!

EDIT: вот вопрос части 2: (Pathinfo vs fnmatch часть 2) Сравнение скорости на Windows и Mac

1
ответ дан 7 December 2019 в 12:17
поделиться

Мои результаты противоположны вашим:

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
1
ответ дан 7 December 2019 в 12:17
поделиться

Используя тот же тестовый код

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
ответ дан 7 December 2019 в 12:17
поделиться

Запуск вашего с

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 секунд на звонок, в любом случае не о чем беспокоиться.

1
ответ дан 7 December 2019 в 12:17
поделиться

Я добавлю сюда свои результаты:

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 при использовании для этой цели.

Специфично для ветвления на определенном расширении.

1
ответ дан 7 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: