pathinfo против fnmatch - PullRequest
       33

pathinfo против fnmatch

7 голосов
/ 22 апреля 2010

Здесь была небольшая дискуссия о скорости fnmatch по сравнению с pathinfo: как проверить, является ли файл php?

Я не был полностью убежден, поэтому решил сравнить две функции.

Использование динамических и статических путей показало, что pathinfo был быстрее.

Действительна ли моя логика и вывод сравнительного анализа?

РЕДАКТИРОВАТЬ : Использование Mac php из cmd

PHP 5.3.0 (cli) (построено: 20 июля 2009 г. 13:56:33) Copyright (c) 1997-2009 PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Технологии

динамический путь, информация 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 PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Технологии

информация о динамическом пути 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

Код:

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

?>

Ответы [ 5 ]

1 голос
/ 03 мая 2010

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

Моя логика и выводы сравнительного анализа верны И все контрольные показатели ответов верны.

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

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

РЕДАКТИРОВАТЬ: вот вопрос второй части: (Pathinfo vs fnmatch part 2). Эталонный тест скорости в Windows и Mac отменен

1 голос
/ 22 апреля 2010

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

dynamic path
pathinfo 4.9078891277313
fnmatch 4.3466200828552
x0.89

static path
pathinfo 1.4787950515747
fnmatch 0.98351812362671
x0.67

Но учтите мой оригинальный комментарий на вопрос, который вы указали:

Что касается скорости, fnmatch выйдет выполнить pathinfo 2: 1 при использовании для с этой целью.

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

1 голос
/ 22 апреля 2010

Запусти свой с

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 голос
/ 22 апреля 2010

Использование того же кода для сравнения

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 голос
/ 22 апреля 2010

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...