关于pathinfo的fnmatch速度有一个小小的辩论:how to check if file is php?
我并不完全相信所以决定对这两个功能进行基准测试。
使用动态和静态路径显示pathinfo更快。
我的基准逻辑和结论是否有效?
编辑:使用cmd中的mac php
PHP 5.3.0(cli)(建于2009年7月20日 13:56:33)版权所有(c)1997-2009 PHP Group Zend Engine v2.3.0, 版权所有(c)1998-2009 Zend 技术
动态路径pathinfo 3.2973630428314 fnmatch 3.4520659446716 x1.05
static path pathinfo 0.86487698554993 fnmatch 1.0420439243317 x1.2
来自cmd的mac xampp php
PHP 5.3.1(cli)(建于2010年2月27日 12:41:51)版权所有(c)1997-2009 PHP Group Zend Engine v2.3.0, 版权所有(c)1998-2009 Zend 技术
动态路径pathinfo 3.63922715187 fnmatch 4.99041700363 x1.37
static path 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
代码:
<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 :(得分:1)
我的结果与你的结果相反:
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 :(得分:1)
使用
运行你的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秒,无论如何都没什么可打扰的。
答案 2 :(得分:1)
使用相同的基准代码
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
答案 3 :(得分:1)
我会把结果扔到这里:
dynamic path
pathinfo 4.9078891277313
fnmatch 4.3466200828552
x0.89
static path
pathinfo 1.4787950515747
fnmatch 0.98351812362671
x0.67
但请记住我对您所关联问题的原始评论:
关于速度,fnmatch将会消失 用于执行pathinfo 2:1 这个目的。
特定于特定扩展名的分支。
答案 4 :(得分:1)
我赞成所有答案,但会回答我自己的问题。
我的基准逻辑和结论是有效的并且所有答案基准都是有效的。
我找到了原因,这引起了另一个问题,而是让这个帖子在切线中消失并使其更长,我将开启另一个问题。我完成后会把新链接放在这里。
感谢我为我做基准测试!
编辑:这是第2部分问题:(Pathinfo vs fnmatch part 2) Speed benchmark reversed on Windows and Mac