具体请看这个GitHub commit,这是composer刚刚引入的一个新改动:
https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799
其改动内容是用gc_disable()函数(PHP 5.3+)在计算依赖关系前把php的循环引用收集器关掉。
评论区的测试表明这个改动的效率提升是非常巨大的(246s->100s、196->104s,138->26s等)。
请问造成这个现象的内在理由是什么?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
Reddit上有评论指出,由于PHP的GC是基于引用计数的,为了能够回收循环引用的对象,会在ref count减少但不到0的时候,试图检测并回收循环引用的孤岛对象,但当有效对象的数量及互相引用较大(比如composer中代表包、版本和互相的依赖关系)的时候,这种搜索的开销就会变得非常巨大,造成大量的CPU计算
有gc的compiler都会使运行速度变慢,因为得遍历heap来回收垃圾