【问题标题】:Why is including multiple files so much slower than bundling into one为什么包含多个文件比捆绑成一个文件要慢得多
【发布时间】:2013-07-16 18:10:09
【问题描述】:

我一直在用 PHP 进行一些测试,我注意到在多个文件上执行 include 与包含所有函数的文件相比要慢得多。

我的测试涉及创建 1025 个文件,其中 1024 个包含文本 <?php class cls$i {} ?>(其中 $i 是文件号),以及 1 个文件是之前文件中所有文本的串联。然后我有两个功能,一个用于测试每个案例。加载单个文件的测试花费了大约6ms 编译为字节码并使内容可供系统使用,然而,1024 个文件的组合几乎花费了600ms

在大小方面,1024 个单独的文件与单个文件的大小完全相同。我也在运行APC 来缓存字节码,但实际上,它只减少了几毫秒。

我还创建了一个 ramdisk 来保存所有文件,但这只是稍微快一点(平均 10 毫秒)。

那么,话虽如此,为什么单个文件比单个文件慢得多?是因为 PHP 中的加载引擎效率显着低下,还是我在配置(在我的本地系统上,标准 AMPPS 安装)中做了相当大的错误?

【问题讨论】:

  • @mario 我的 Ampps 系统在带有 NTFS 和 RAMDISK 仿真器的 Windows 8 上运行,但我在 Arch Linux 上使用 EXT3 和 /tmp 进行了相同的测试,两者都差不多只有几毫秒,所以我认为这无关紧要。我刚刚重新运行完代码,其中每个类都有几个静态的,几个可实例化的函数,结果几乎没有变化

标签: php performance include


【解决方案1】:

我的第一个猜测是所有 stat 系统调用都在进行中。

如果您在配置中关闭 apc.stat 会发生什么?

即使APC缓存了字节码,如果apc.stat=1,它需要通过文件系统检查每个文件的mtime,以确保它不需要重新读取。

编辑:更深入地回应您的评论。您如何引用包含的文件?如果您使用的是相对路径,那么您将涉及到 include_path。

换句话说:

include "somefile.php";

可能比

include __DIR__ . '/otherfile.php';

【讨论】:

  • 哇,加载时间增加了一倍,对于更大的文件集,加载时间减少到 300ms,但在比较相同的文件内容时仍然存在巨大差异。不可能都在寻道时间
  • 测试使用include $b . $i . '.php' 用于$b = __DIR__ . DIRECTORY_SEPARATOR 的较大集合,但与__DIR__ . DIRECTORY_SEPARATOR . $i . '.php' 之间没有明显区别
  • 是的,它们应该是等价的,因为它们都是绝对的。我想知道那些将近 300 毫秒是否只是命中缓存的成本。我希望它会更高。 APC 向您展示了什么样的统计数据?
  • 啊,我明白你的意思了,当我从文件名中删除绝对部分时,我又损失了 70 毫秒...你在寻找什么统计数据?但我不认为 APC 有这么大的问题,因为不使用 APC 并且在重新启动后,单个文件大约需要 10 毫秒,文件组需要 1200 毫秒。是的,差异要大得多,但就相对增长而言,它是相同的。所以,这似乎更多地与 PHP 相关,而不是 APC
  • 安装 apc 后,它会在某处放置一个 apc.php 文件,该文件会为您提供有关缓存行为方式的各种统计信息/图表。我只是想排除它没有装满,或者其他什么。我有点惊讶 1024 缓存调用需要这么长时间,但我想这是可能的。在这一点上,我认为我们已经到了需要开始分析 php 解释器本身以找出它花费时间的地方。如果我这周晚些时候有时间,也许我会自己进行一些实验。
猜你喜欢
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2016-06-19
  • 2016-08-02
相关资源
最近更新 更多