我知道这是一个非常老的问题,但我也在想同样的事情,谷歌把我带到了这里。我最终在一个小型通用数字海洋服务器上使用 PHP 7.4(现已停止更新)进行了一些基准测试,该服务器具有 SSD 驱动器。
方法:
我创建了 260 个类,每个类都在自己的文件中。文件的命名方式类似于 A0.php、A1.php、A2.php、...、Z8.php、Z9.php。它们的大小为 608 字节,因此在阅读结果时请记住这一点。
我还创建了一个单独的文件 LotsOfClasses.php,其中包含所有 260 个类。该文件的大小约为 155k。
脚本是通过 PHP 命令行运行的,没有缓存。应该假设磁盘缓存按照底层 CentOS 操作系统的正常工作方式工作。
以下是测试脚本的基本外观(选择 microtime 而不是 hrtime 是因为它更容易被人类阅读):
<?php
$start = microtime(true);
foreach (range('A', 'Z') as $letter) {
foreach (range(0, 9) as $i) {
include "{$letter}{$i}.php";
}
}
echo (microtime(true) - $start) . "\n";
并且
<?php
$start = microtime(true);
include "LotsOfClasses.php";
echo (microtime(true) - $start) . "\n";
我随后将每个脚本批量运行100次,共3次:
for i in {1..100}; do php benchmark.php; done > time.txt
我还编写了一个脚本来计算时间的平均值。虽然没有什么花里胡哨的东西,但为了完整起见,在这里也包括它:
<?php
$file = file_get_contents("time.txt");
$values = array_filter(explode("\n", $file));
echo (array_sum($values) / sizeof($values)) . "\n";
命令行结果:
包含260个类的1个文件的平均时间为11.79毫秒。
每个文件都有一个类,包含260个文件的平均时间为21.42毫秒。
Web服务器结果:
敏锐的读者可能会问,包含大约155k的单个文件需要11.79ms。这是否意味着如果您的应用程序加载100个这样的文件,仅包含文件就需要超过1秒钟?如果使用命令行,则答案是肯定的。但是,PHP通常通过服务器运行。在命令行上运行时,PHP必须每次解析文件。通过服务器加载文件时,PHP将使用其Opcache,速度显着更快。
包含260个类的1个文件的平均时间为0.056毫秒。
从Web服务器中包含260个文件的平均时间为0.65毫秒。
结论:
当通过 Web 服务器加载一个大文件时,几乎是瞬间完成的,但是在加载一个文件和 260 个较小文件时,只有 0.6 毫秒的差异。这种增加可以忽略不计,合并文件基本上只是微观优化。即使在更大的应用程序中,我也无法想象它会超过几毫秒的差异。此外,单个文件可能更复杂,难以维护。我认为,在加载多个可维护文件方面做出微不足道的时间增加的权衡是值得的。
值得一提的是,我还尝试了在 Web 服务器上使用 260 个文件版本的 include_once
,它只增加了 0.08 毫秒的时间。