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