【问题标题】:pathinfo vs fnmatch路径信息与 fnmatch
【发布时间】:2011-02-11 05:08:11
【问题描述】:

关于 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 技术

动态路径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 技术

动态路径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

代码:

<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>

【问题讨论】:

  • 应该是 CW,因为我猜这不是一个真正的问题
  • 这是一个真正的问题!为什么其他人会得出不同的结论?
  • 您运行了多少次测试?在多任务机器上,某些任务可能会延迟,从而减慢通常可能更快的部分代码。
  • 我已经运行了很多次并且得到了相同的结果...我已经用命令行的结果更新了我的帖子。

标签: php benchmarking pathinfo fnmatch


【解决方案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

【讨论】:

    【解决方案2】:

    运行你的

    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 秒,反正也没什么好麻烦的。

    【讨论】:

      【解决方案3】:

      使用相同的基准测试代码

      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
      

      【讨论】:

        【解决方案4】:

        我会把我的结果放在这里:

        dynamic path
        pathinfo 4.9078891277313
        fnmatch 4.3466200828552
        x0.89
        
        static path
        pathinfo 1.4787950515747
        fnmatch 0.98351812362671
        x0.67
        

        但请记住我对您链接到的问题的原始评论:

        关于速度,fnmatch 会出 使用时执行 pathinfo 2:1 这个目的。

        特定于特定扩展的分支。

        【讨论】:

          【解决方案5】:

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

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

          我找到了原因,这引发了另一个问题,但我宁愿让这篇文章偏离正题,让它变得更长,我将打开另一个问题。完成后我会将新链接放在这里。

          感谢您为我进行基准测试!

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多