为什么包含多个文件比捆绑到一个文件要慢得多


Why is including multiple files so much slower than bundling into one

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

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

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

我还创建了一个存储所有文件的ramdisk,但速度仅略快(平均10ms)。

既然如此,为什么单个文件比单个文件慢得多?是因为PHP中的加载引擎效率低下,还是我在配置(在我的本地系统上,一个标准的AMPPS安装)中犯了很大的错误?

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

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

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

编辑:深入了解,以回应您的评论。您是如何引用包含的文件的?如果您使用的是相对路径,那么您得到的是include_path。

换句话说:

include "somefile.php";

可能比慢

include __DIR__ . '/otherfile.php';