前面我們討論了內存的工作原理,也進行了一些性能相關的測試。那么今天開始我們來看幾個在實踐中的應用。首先我們先從PHP開始。2015年,PHP7的發布可以說是在技術圈里引起了不小的轟動,因為它的執行效率比PHP5直接翻了一倍。PHP7在內存方面,你是否知道作者都進行了哪些優化?幾個核心結構體的改進只是表面上看起來優化的幾個字節那么簡單?讓我們從幾個核心的數據結構改進開始看起。
1 PHP7zval的變化
1、php5.3中的zval:
我們這里只討論64位操作系統下的情況。該zval_struct結構體中的由四個成員構成,其中zvalue_value稍微復雜一些,是一個聯合體。聯合體中最長的成員是一個指針加一個int,8+4=12字節。但是默認情況下,會進行內存對齊,故zval_struct會占用16字節。那么。
_zval_struct總的字節 = value(16)+ refcount__gc(4)+ type(1)+ is_ref__gc(1)= 占用22字節。
最后再考慮下內存對齊,實際占用24字節。(如果算的有點暈話,感興趣的同學可以寫段簡單的測試代碼,使用sizeof查看一下)
2、PHP7.2中的zval
7.2中的zval_struct結構體里由3個成員構成,其中zend_value看起來比較復雜,實際上只是一個8字節的聯合體。u1也是一個聯合體,占用是4個字節。u2也一樣。這樣zval_struct就實際占用16個字節。
2 PHP7 HashTable的變化
1、PHP5.3里的HashTable:
在5.3里HashTable就是一個大struct, 有點小復雜,我們拆開了細說,
uint nTableSize 4字節
uint nTableMask 4字節
uint nNumOfElements 4字節,
ulong nNextFreeElement 8字節 注意這前面的4個字節會被浪費掉,因為nNextFreeElement的開始地址需要對齊
Bucket *pListHead 8字節
Bucket *pListTail 8字節
Bucket **arBuckets 8字節
dtor_func_t pDestructor 8字節
zend_bool persistent 1字節
unsigned char nApplyCoun 1字節
zend_bool bApplyProtection 1字節
最終,總字節數 = 4+4+4+4(nNextFreeElement前面這四個字節會留空)+8+8+8+8+8+8+1+1+1 = 67字節。再加上結構體本身要對齊到8的整數倍,所以實際占用72字節。
2、PHP7.2里的HashTable:
在7.2里HashTable
zend_refcounted_h gc 看起來唬人,實際就是個long,占用8字節
union... u 占用4字節
uint32_t 占用4字節
Bucket* 指針占用8字節
uint32_t nNumUsed 占用4字節
uint32_t nNumOfElements 占用4字節
uint32_t nTableSize 占用4字節
uint32_t nInternalPointer 占用4字節
zend_long nNextFreeElement 占用8字節
dtor_func_t pDestructor 占用8字節
總占用
字節數 = 8+4+4+8+4+4+4+4+8+8 = 56字節,并且正好達到了內存對齊的狀態,沒有額外的浪費。
另外還有PHP源代碼里經常出鏡的Buckets也從72下降到了32字節,這里我就不翻源代碼了。
3 優化思想精髓
當當當,敲黑板,重點來了!我們看了兩個核心數據結構的結構體變化,這上面的優化都是什么含義呢?拿HashTable舉例,貌似從72字節優化到了56字節,這內存節約的也不是特別多嘛,才20%多而已!但這中間其實隱藏了兩個較深層次優化思路:
第一、你是否記得我們前面CPU在向內存要數據的時候是以Cache Line為單位進行的,而我們說過Cache Line的大小就是64字節。回過頭來看HashTable,在7.2里的56字節,只需要CPU向內存進行一次Cache Line大小的burst IO,就夠了。而在5.3里的72字節,雖然只比Cache Line大了那么一丟丟,但是對不起,必須得進行兩次burst IO才可以。所以,在計算機里,56字節相對72字節實際上是翻倍的性能提升!!
第二、CPU的L1、L2、L3的容量是固定的幾十K或者幾十M。假設Cache的都是HashTable,那么Cache容量不變的條件下,能Cache住的HashTable將會翻倍,緩存命中率提升一大截。要知道L1命中后只需要1ns多一點的耗時,而如果穿透到內存的話可能就需要40多納秒的延時了,整整差了幾十倍。
所以PHP內核的作者大牛深諳CPU與內存的工作原理,表面上看起來只是幾個字節的節約,但是實際上爆發出了巨大的性能提升!!
審核編輯:劉清
-
cpu
+關注
關注
68文章
10901瀏覽量
212639 -
內存
+關注
關注
8文章
3048瀏覽量
74209 -
操作系統
+關注
關注
37文章
6882瀏覽量
123581 -
PHP
+關注
關注
0文章
454瀏覽量
26738
發布評論請先 登錄
相關推薦
評論