gpt4 book ai didi

php - 如果 classmap 实际上更快,为什么要在 composer 中使用 PSR-0 或 PSR-4 自动加载?

转载 作者:IT王子 更新时间:2023-10-29 01:11:11 28 4
gpt4 key购买 nike

我知道您可以使用 PSR 标准来定位文件,或者告诉 composer 一个目录来扫描类。 documentation recommends using the PSR-4标准。 Composer 还可以选择创建optimized autoloader, which basically generates a full classmap。 .那么,如果最好的加载方式是使用类映射,为什么还要使用 PSR-4?

对我来说,保持目录结构是有意义的,因为无论如何这都是一种很好的组织方式。但是,似乎合乎逻辑的选择是在开发机器上使用 PSR-4 加载,然后在生产环境中使用类映射。这样,您不必在每次创建新类时都重新构建类映射,而是在生产环境中创建一个完整的类映射作为部署过程的一部分,而无需额外调用

./composer.phar dump-autoload -o

最佳答案

问题在于 classmap 实际上并不是在每种情况下都更快!

classmap 的速度来自于在执行加载文件、解析文件(操作码缓存在这里会有所帮助)然后执行它的总是必要的工作之前不必检查文件系统是否存在。

但是类映射的缺点是,您可能会为您使用的库中包含的每个类、接口(interface)和特征生成大量数据,而您实际上并未在生产代码中使用它。加载巨大的数组不是免费的——虽然代码不需要一次又一次地解析(操作码缓存),但它仍然必须执行,数组数据结构必须放入内存,填充大量字符串,然后占用了一些可能用于其他用途的内存。

我找到了两个讨论这个话题的资源:首先有 github issue #1529建议使用一堆符号链接(symbolic link)对 Composer 自动加载器进行进一步改进,以避免扫描多个目录。

那里的讨论还表明,您实际上应该尝试在 PSR-0 自动加载声明中使用最好的命名空间或类名前缀,即可能的最长的一个。您还可以在声明中使用多个前缀。

然后是a blog post linked in that issue它记录了一些使用 EZPublish 5 的 xhprof 基准测试并调整设置,包括 APC 缓存和类映射转储。

金钱报价:

This command created a 662KiB vendor/composer/autoload_classmap.php file containing an array that is a hash composed of the class name as index and the path to the file containing the class definition as value. At the time I am writing this post, this array is composed of 4168 entries. [...] Although it should give us the most efficiant autoloading mechanism, it actually slows things down (from 254.53 reqs/second to 197.95). The reason being that even if the file is cached by APC, the PHP array containing the map with more than 4100 entries needs to be re-created at every single request.

类图会很快吗?当然。在每种情况下最快?当然不是——这取决于每个请求使用的类与未使用的类的比率。因此,即使平均而言,您的应用程序实际上使用了映射中的所有类,如果您每次请求仅使用大约 10% 的类,则类映射可能仍然较慢,并且您最好优化您使用的库的自动加载声明.事实上,每个类名前缀都应该只指向一个目录。

请注意,您获得的性能提升仅在每个请求大约低个位数毫秒的范围内。如果该数字在 5% 到 10% 的范围内显着提高性能,那么您的应用程序肯定很棒。但是如果你真的在那个性能范围内,盲目地相信类映射总是更快可能会浪费很多不必要的 CPU 周期。

如果您优化某些东西:测量它!如果你无法衡量它,你怎么知道它是否真的变得更好?

关于php - 如果 classmap 实际上更快,为什么要在 composer 中使用 PSR-0 或 PSR-4 自动加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22803419/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com