首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pathinfo vs fnmatch

pathinfo vs fnmatch
EN

Stack Overflow用户
提问于 2010-04-22 18:31:23
回答 5查看 1.5K关注 0票数 7

关于fnmatch在pathinfo上的速度,有一个小小的争论: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 Technologies

动态路径pathinfo 3.2973630428314 fnmatch 3.4520659446716 x1.05

静态路径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 Technologies

动态路径pathinfo 3.63922715187 fnmatch 4.99041700363 x1.37

静态路径pathinfo 1.03110480309 fnmatch 2.38929820061 x2.32

我在我的机器上包含了一个以秒为单位的结果样本,在我的机器上进行了100,000个迭代:

代码语言:javascript
复制
dynamic path
pathinfo 3.79311800003
fnmatch 5.10071492195
x1.34

static path
pathinfo 1.03921294212
fnmatch 2.37709188461
x2.29

代码:

代码语言:javascript
复制
<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>
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-03 16:12:38

我对所有的答案都投了赞成票,但会回答我自己的问题。

我的基准测试逻辑和结论是有效的,所有的答案基准都是有效的。

我已经找到了原因,这已经提出了另一个问题,但更确切地说,让这篇文章切线,并使它更长,我将打开另一个问题。当我这样做的时候,我会把新的链接放在这里。

谢谢你帮我做标杆!

编辑:这是第2部分的问题:(Pathinfo vs fnmatch part 2) Speed benchmark reversed on Windows and Mac

票数 1
EN

Stack Overflow用户

发布于 2010-04-22 18:41:38

我的结果与你相反:

代码语言:javascript
复制
php -f 2693428.php
dynamic path
pathinfo 4.5834331512451
fnmatch 3.2174317836761
x0.7

static path
pathinfo 2.1787130832672
fnmatch 0.95714497566223
x0.44

版本

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-04-22 18:43:13

用你的

代码语言:javascript
复制
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

给出

代码语言:javascript
复制
dynamic path
pathinfo 3.4931519031525
fnmatch 2.8633069992065
x0.82

static path
pathinfo 0.83261299133301
fnmatch 0.28636598587036
x0.34

这四个

代码语言:javascript
复制
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);
}

像这样跑的时候

代码语言:javascript
复制
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给我的机器上

代码语言:javascript
复制
Average Mean Time = 0.000007
Average Mean Time = 0.000006
Average Mean Time = 0.000005
Average Mean Time = 0.000003

我觉得有点烦人的是,4号是最快的,但它是这样说的。每次通话有0.00000秒就没什么麻烦了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2693428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档