PSR-0 和 PSR-4(以及类映射)的问题,其实现没有考虑优化。充其量是缺乏实施。
然而,类映射背后的想法是有效的。
我创建了一个可以生成类映射的库。然而,这个类映射更简单,但它已经过优化。
https://github.com/eftec/autoloadone
即使对于一个大项目,地图也会减少,如果它们包含在同一个文件夹中,它会将相同命名空间的相同类分组。如果没有,那么它们也包括在内不是问题。此外,如果类缺少命名空间,文件中有两个类,文件超出范围,这不是问题,它会跟踪所有这些。您甚至可以排除一些文件夹或命名空间。
例如,在一个大项目中
Number of Classes: 898
Number of Namespaces: 62
Number of Maps: 117
Number of PHP Files: 1693
Number of PHP Autorun: 0
Number of conflict: 1
Ratio map: 6.91% (less is better. 100% means one map/one file)
Map size: 12.9 kbytes (less is better, it's an estimate of the memory used by the map)
因此,对于一个有 898 个类的项目,地图只使用了 12.9kb。
以及性能上有什么区别:
- 它不需要扫描文件夹(例如,如果文件不存在)。
- 它不验证文件是否不存在。
- 它只是一个文件。因此,开销是单个包含,而不是 3 个
Composer 的自动加载包括(对于每个调用)下一个文件:
- 自动加载.php
- composer/ClassLoader.php(取决于配置)
- 作曲家/autoload_real.php
- 作曲家/autoload_namespaces.php
- 作曲家/autoload_psr4.php
- 作曲家/autoload_classmap.php (89kb)
或者它运行文件:
- 自动加载.php
- composer/ClassLoader.php(取决于配置)
- 作曲家/autoload_static.php (107kb)
虽然 Opcache 确实令人惊叹,但我们仍然至少包含两个包含(而不是一个),而且其中一个非常大,而且仍然是开销,而且仍然是每次调用。
所以,哪个更快。这取决于项目,但我检查过 PSR-0 通常更快。但是,区别很微弱,两者都很慢。:-P