Nikita Popov 在他的演讲中谈了几个PHP 程序中和performance相关的point。
1.PHP使用shared memory, preload的方式事先分配,而只有在所有的处理结束之后,share memory 才会断开和所有进程或者thread之间的联系。
光是opcode,FPM的设定还不足以提高performance.
用class,并且尽量用继承既有class的方式创建新的class 可以比较好的利用资源
用array 比用class要消耗内存资源
PHP中有两种cache方式,一种是ACPU,一种是opcache,ACPU对于比较大的数据handle起来比较吃力,只能操作一些较小的原生的type
array 比class 要消耗内存
其中[ "foo"=>"bar", "bar"=>"baz"] 这种形式的array最为消耗内存,相比之下packed array, ["bar","baz"]略少,可以参考下图:
memoUsage_php.png
Type check 对于比较多loop的程序反而是有优化performance作用的
通常认为不标注变量的type,php在运行的初期不做type check, 运行的performance更好,但在使用opcache的情况,做type check可以提升2.5倍的执行速度:
typeOptimization.jpg
GC会影响程序运行,如果关闭GC,可以提升运行速度
GC的运行原理,在7.3之前是预先开了10000root buffer,然后再GC去回收7.3之后采用动态GC阈值,稍微提高了一些效率。
另外GC的mark,swap 方式,在变量count到0的情况下销毁,而对于一些传址而非传值的函数无法count 到0,可能会产生遗漏(可能会发生memory leak)
GC.jpg
namespace的定义
一些含糊的namespace 定义使得VM查找class或者function变得迂回,建议在一些namespace面前加上\ 明确命名空间。
(这个目前7.4之后会给出compiler error提示而矫正)
namespaceFallback.jpg