PHP:file_exists 与stream_resolve_include_path - 哪个性能更好?

2023-11-27

似乎最近 php 开发人员对使用它是否更好感到好奇文件已存在() or Stream_resolve_include_path()检查文件是否存在时(无论是包含它们、缓存系统等)。

这让我想知道是否有人做过基准测试,以判断哪一个是更好的选择,无论是页面加载时间、服务器性能还是内存使用情况。

我在 SO 找不到任何可以解决此问题的内容,因此认为我们是时候这样做了。


我做了一些基准测试,但在获得结果之前,让我们看看这些函数是如何工作的。你可以阅读PHP源代码here。有一个这个答案的法语版本,本周早些时候写的,时机很好;)。

我将会说is_file()也是如此,因为它被定义到源代码中的相同核心函数中。对于核心功能,我说的是 C 源代码,无法从 PHP 语言访问到您的脚本中。

据我了解,file_exists() and is_file()是核心函数的子函数php_stat()。这是该过程的高度简化的伪代码:

function php_stat($file)
{
    'file_exists'
        ↳ virtual_file_ex($file)
            ↳ virtual_access($file)
                'Windows'
                    ↳ tsrm_win32_access($file)
                        ↳ return access($file)
                'Other systems'
                    ↳ return access($file)
    'is_file'
        ↳ return $file.st_mode == S_IFREG
}

以及伪代码stream_resolve_include_path()过程:

function stream_resolve_include_path($file)
{
    zend_resolve_path($file)
        ↳ php_resolve_path_for_zend($file)
            ↳ php_resolve_path($file)
                ↳ tsrm_realpath($file)
                    ↳ return estrdup($file)
}

从这里,即使没有基准的数字结果,您也可以看到一个函数的资源消耗有多大。


基准测试代码:

function bench_file($file) {
    $res = array();
    $max = 1000000;

    // is_file()
    $res[] = microtime(1);
    for ( $i = 0; $i < $max; ++$i ) {
        if ( is_file($file) ) {
            //
        }
    }
    $res[] = microtime(1);

    clearstatcache();

    // file_exists()
    $res[] = microtime(1);
    for ( $i = 0; $i < $max; ++$i ) {
        if ( file_exists($file) ) {
            //
        }
    }
    $res[] = microtime(1);

    clearstatcache();

    // stream_resolve_include_path()
    $res[] = microtime(1);
    for ( $i = 0; $i < $max; ++$i ) {
        if ( stream_resolve_include_path($file) !== false ) {
            //
        }
    }
    $res[] = microtime(1);

    printf(
        'is_file = %f, file_exists = %f, stream_resolve_include_path = %f',
        $res[1] - $res[0], $res[3] - $res[2], $res[5] - $res[4]
    );

}

让我们用一个存在的文件 (1) 和一个不存在的文件 (2) 进行测试:

1 : is_file = 0.218582, file_exists = 0.742195, stream_resolve_include_path = 1.626521
2 : is_file = 0.458983, file_exists = 0.644638, stream_resolve_include_path = 5.623289

结果不言而喻;)


Benchmark v2 - 只是添加新功能进行测试的更简单方法。

function micro($func, $file) {
    $max = 1000000;
    $start = microtime(1);
    for ( $i = 0; $i < $max; ++$i ) {
        if ( $func($file) ) {
            //
        }
    }
    $end = microtime(1);
    clearstatcache();
    return $end - $start;
}

function bench_file($file) {
    $res = array(
        'is_file' => micro('is_file', $file),
        'file_exists' => micro('file_exists', $file),
        'stream_resolve_include_path' => micro('stream_resolve_include_path', $file)
    );
    $ret = '';
    foreach ( $res as $key => $value ) {
        $ret .= sprintf('%s = %f, ', $key, $value);
    }
    return trim($ret, ', ');
}

echo '<pre>', bench_file('file-ok'), "\n", bench_file('file-ko'), '</pre>';

Results:

is_file = 0.295752, file_exists = 0.852082, stream_resolve_include_path = 1.759607
is_file = 0.527770, file_exists = 0.724793, stream_resolve_include_path = 5.916151

打电话有一点费用$funct(),这解释了数字略高的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP:file_exists 与stream_resolve_include_path - 哪个性能更好? 的相关文章

随机推荐

  • StringBuilder 与 XmlTextWriter

    我试图从提供 Xml 内容的自定义 HttpHandler 中获得尽可能多的性能 我想知道哪个性能更好 使用 XmlTextWriter 类或临时 StringBuilder 操作 例如 StringBuilder sb new Strin
  • 具有自定义项目的 UIMenuController 不适用于 UICollectionview

    当长按 UICollectionViewCell 时 我添加了自定义菜单控制器 self becomeFirstResponder UIMenuItem menuItem UIMenuItem alloc initWithTitle Cus
  • 根据类为 DOM 元素添加事件监听器

    我有一张桌子 其中每个tr and td只有课程 我在选择课程时遇到问题td具有我需要的类的元素 HTML table tr class data td class cell 1 td td class cell2 td tr tr cla
  • 如何将 OrderBy 表达式数组传递给方法?

    我正在尝试增强我的存储库 以便它负责订购 我已经应用了来自的答案这个问题就存储库而言 我很确定它已经完成了 我遇到的问题是我不确定现在如何将数组传递给存储库中的方法 编译器一直对我大喊关于委托的事 在上面的链接问题中 作者本质上是在做我想做
  • 如何在 r 中绘制 3D 函数? [复制]

    这个问题在这里已经有答案了 我有一个 3D 函数 比方说 De Jong 函数 fdejong lt function x y return x 2 y 2 我怎样才能以3D方式绘制它的情节 我想实现与维基百科类似的效果 尝试这个 fdej
  • 向 iOS 应用程序添加拖放组件

    如果这看起来很模糊 我深表歉意 但我不知道还能怎么说 我正在尝试构建一个 iPad 应用程序 让用户可以使用他们需要的工具填充工作区 我需要一个让用户将组件拖放到应用程序界面中的示例 例如 如果我有一个应用程序 用户可以制作表单 并且我希望
  • 在Python中从列表元素中查找互斥集合的组合

    在我目前正在进行的一个项目中 我已经实现了大约 80 我希望我的程序完成的任务 我对结果非常满意 在剩下的 20 中 我面临着一个让我有点困惑的问题 不知道如何解决 这里是 我想出了一个包含多个数字 任意长度 的列表列表 例如 listEl
  • Bundler::RubyVersionMismatch:您的 Ruby 版本是 1.9.3,但您的 Gemfile 指定为 2.0.0

    我正在使用带有 Pow Ruby Rails 和一堆有用的 gem 的 Mac 最近 每当我尝试打开我的应用程序时 都会遇到此错误 Bundler RubyVersionMismatch 您的 Ruby 版本是 1 9 3 但您的 Gemf
  • 翻译大量文本数据的最佳方法是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我有很多文本数据 想将其翻译成不同的语言 我知道的可能的方法 谷歌翻译 API 必应翻译器 API 问题是这些服务都对文字长度 通话次数等都有限制
  • 编辑 jar 内的 .properties 文件,无需解压或更改为 .zip 格式

    我目前参与的一个项目需要加载位于 jar 文件内的属性文件 并且我需要编辑 tat properties 文件 我在谷歌上搜索了一下 看到了实现这个想法的多种不同方法 说我需要将其重命名为 zip 文件 并在再次编辑后转换为 jar 但我对
  • 如何获取 SVG tspan 元素的宽度

    我正在尝试获取 a 的渲染宽度tspan元素 位于textSVG 中的元素 这是我的标记
  • 通过 URL 打开 Native AIR 应用程序?

    我希望人们能够通过 URL 启动 Native AIR 应用程序 我的 AIR 应用程序会读取其中的一些参数并打开到正确的状态 因此 用例是有人浏览我们的网站 然后单击链接 它将打开本机桌面应用程序以查看与其链接关联的正确内容 我知道 iT
  • 从 Matlab 函数返回多个输出变量

    可以说我有一个功能 function A B C test x y z A 2 x B 2 y C 2 z end 当您按运行时 Matlab 仅返回输出参数中的第一个值 A 在这种情况下 是否有一个命令可以放入我的函数中 自动返回所有函数
  • 捕获 ASP.NET UserControls 中未处理的异常

    我动态加载用户控件 将它们添加到 Web 表单的 Controls 集合中 如果用户控件在渲染时导致未处理的异常 我想隐藏它们 因此 我尝试挂钩每个 UserControl 的 Error 事件 但似乎 UserControl 永远不会像
  • SQLITE - 将行正确转换为列

    我有一个包含产品订单表的数据库 如下所示 order id prod code prod color size quantity 1 SHIRT 001 S 10 1 SHIRT 001 M 7 1 SHIRT 001 L 8 1 SHIR
  • XAMLParseException 让我抓狂!

    这个 XAMLParseException 让我抓狂 我在 Visual Studio 1020 中使用 NET 3 5 这是我的 xaml
  • 准备从 Python 2.x 转换到 3.x

    到目前为止 我们都知道 我希望如此 Python 3 正在慢慢开始取代 Python 2 x 当然 大多数现有代码最终移植还需要很多年的时间 但我们现在可以在 2 x 版本代码中做一些事情 以使切换更容易 显然是在看什么是新的3 x 中的版
  • 让 will_paginate 与 Ajax 配合使用的最佳方法

    如果你谷歌 will paginate 和 ajax 最上面的结果是这篇博文 但是 will paginate 的原作者说不使用这个方法 对 SEO 蜘蛛不利 但我无法让原作者的方法起作用 他的 javascript 杀死了我所有的链接 另
  • Datetime.ToString() C# 未按预期工作

    From msdn看来我可以创建自己的格式Datetime ToString 方法通过使用M m d y等等 但是当我尝试一个时 它没有按预期工作 下面的截图就是问题所在 我正期待着7 29 2015但收到了7 29 2015 为什么 看起
  • PHP:file_exists 与stream_resolve_include_path - 哪个性能更好?

    似乎最近 php 开发人员对使用它是否更好感到好奇文件已存在 or Stream resolve include path 检查文件是否存在时 无论是包含它们 缓存系统等 这让我想知道是否有人做过基准测试 以判断哪一个是更好的选择 无论是页