91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PHP7在內(nèi)存方面你是否知道都進(jìn)行了哪些優(yōu)化

冬至配餃子 ? 來源:開發(fā)內(nèi)功修煉 ? 作者:張彥飛allen ? 2022-08-30 17:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前面我們討論了內(nèi)存的工作原理,也進(jìn)行了一些性能相關(guān)的測試。那么今天開始我們來看幾個在實踐中的應(yīng)用。首先我們先從PHP開始。2015年,PHP7的發(fā)布可以說是在技術(shù)圈里引起了不小的轟動,因為它的執(zhí)行效率比PHP5直接翻了一倍。PHP7在內(nèi)存方面,你是否知道作者都進(jìn)行了哪些優(yōu)化?幾個核心結(jié)構(gòu)體的改進(jìn)只是表面上看起來優(yōu)化的幾個字節(jié)那么簡單?讓我們從幾個核心的數(shù)據(jù)結(jié)構(gòu)改進(jìn)開始看起。

1 PHP7zval的變化

1、php5.3中的zval:

pYYBAGMN0taADI7ZAACph_e53O8634.png

我們這里只討論64位操作系統(tǒng)下的情況。該zval_struct結(jié)構(gòu)體中的由四個成員構(gòu)成,其中zvalue_value稍微復(fù)雜一些,是一個聯(lián)合體。聯(lián)合體中最長的成員是一個指針加一個int,8+4=12字節(jié)。但是默認(rèn)情況下,會進(jìn)行內(nèi)存對齊,故zval_struct會占用16字節(jié)。那么。

_zval_struct總的字節(jié) = value(16)+ refcount__gc(4)+ type(1)+ is_ref__gc(1)= 占用22字節(jié)。

最后再考慮下內(nèi)存對齊,實際占用24字節(jié)。(如果算的有點暈話,感興趣的同學(xué)可以寫段簡單的測試代碼,使用sizeof查看一下)

2、PHP7.2中的zval

poYBAGMN0uyAUol1AADs2EZskZs450.png

7.2中的zval_struct結(jié)構(gòu)體里由3個成員構(gòu)成,其中zend_value看起來比較復(fù)雜,實際上只是一個8字節(jié)的聯(lián)合體。u1也是一個聯(lián)合體,占用是4個字節(jié)。u2也一樣。這樣zval_struct就實際占用16個字節(jié)。

2 PHP7 HashTable的變化

1、PHP5.3里的HashTable:

pYYBAGMN0v-AGU2NAACNlGKBu8M639.png

在5.3里HashTable就是一個大struct, 有點小復(fù)雜,我們拆開了細(xì)說,

uint nTableSize 4字節(jié)

uint nTableMask 4字節(jié)

uint nNumOfElements 4字節(jié),

ulong nNextFreeElement 8字節(jié) 注意這前面的4個字節(jié)會被浪費掉,因為nNextFreeElement的開始地址需要對齊

Bucket *pInternalPointer 8字節(jié)

Bucket *pListHead 8字節(jié)

Bucket *pListTail 8字節(jié)

Bucket **arBuckets 8字節(jié)

dtor_func_t pDestructor 8字節(jié)

zend_bool persistent 1字節(jié)

unsigned char nApplyCoun 1字節(jié)

zend_bool bApplyProtection 1字節(jié)

最終,總字節(jié)數(shù) = 4+4+4+4(nNextFreeElement前面這四個字節(jié)會留空)+8+8+8+8+8+8+1+1+1 = 67字節(jié)。再加上結(jié)構(gòu)體本身要對齊到8的整數(shù)倍,所以實際占用72字節(jié)。

2、PHP7.2里的HashTable:

pYYBAGMN0xKAQDrkAACWEr2NQKE768.png

在7.2里HashTable

zend_refcounted_h gc 看起來唬人,實際就是個long,占用8字節(jié)

union... u 占用4字節(jié)

uint32_t 占用4字節(jié)

Bucket* 指針占用8字節(jié)

uint32_t nNumUsed 占用4字節(jié)

uint32_t nNumOfElements 占用4字節(jié)

uint32_t nTableSize 占用4字節(jié)

uint32_t nInternalPointer 占用4字節(jié)

zend_long nNextFreeElement 占用8字節(jié)

dtor_func_t pDestructor 占用8字節(jié)

總占用

字節(jié)數(shù) = 8+4+4+8+4+4+4+4+8+8 = 56字節(jié),并且正好達(dá)到了內(nèi)存對齊的狀態(tài),沒有額外的浪費。

另外還有PHP源代碼里經(jīng)常出鏡的Buckets也從72下降到了32字節(jié),這里我就不翻源代碼了。

3 優(yōu)化思想精髓

當(dāng)當(dāng)當(dāng),敲黑板,重點來了!我們看了兩個核心數(shù)據(jù)結(jié)構(gòu)的結(jié)構(gòu)體變化,這上面的優(yōu)化都是什么含義呢?拿HashTable舉例,貌似從72字節(jié)優(yōu)化到了56字節(jié),這內(nèi)存節(jié)約的也不是特別多嘛,才20%多而已!但這中間其實隱藏了兩個較深層次優(yōu)化思路:

第一、你是否記得我們前面CPU在向內(nèi)存要數(shù)據(jù)的時候是以Cache Line為單位進(jìn)行的,而我們說過Cache Line的大小就是64字節(jié)?;剡^頭來看HashTable,在7.2里的56字節(jié),只需要CPU向內(nèi)存進(jìn)行一次Cache Line大小的burst IO,就夠了。而在5.3里的72字節(jié),雖然只比Cache Line大了那么一丟丟,但是對不起,必須得進(jìn)行兩次burst IO才可以。所以,在計算機里,56字節(jié)相對72字節(jié)實際上是翻倍的性能提升??!

第二、CPU的L1、L2、L3的容量是固定的幾十K或者幾十M。假設(shè)Cache的都是HashTable,那么Cache容量不變的條件下,能Cache住的HashTable將會翻倍,緩存命中率提升一大截。要知道L1命中后只需要1ns多一點的耗時,而如果穿透到內(nèi)存的話可能就需要40多納秒的延時了,整整差了幾十倍。

所以PHP內(nèi)核的作者大牛深諳CPU與內(nèi)存的工作原理,表面上看起來只是幾個字節(jié)的節(jié)約,但是實際上爆發(fā)出了巨大的性能提升!!



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11279

    瀏覽量

    225068
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    9

    文章

    3211

    瀏覽量

    76377
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7402

    瀏覽量

    129334
  • PHP
    PHP
    +關(guān)注

    關(guān)注

    0

    文章

    462

    瀏覽量

    28642
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    容易造成單片機內(nèi)存溢出的幾個陷阱介紹

    久了就極有可能會導(dǎo)致內(nèi)存的泄露(重啟一下就能解決90%的問題根源),同時我們在釋放的時候也要注意釋放的內(nèi)存只能釋放一次,不要重復(fù)的釋放,有的時候代碼量會比較大,所以有可能會在不止一處地方進(jìn)行了代碼
    發(fā)表于 01-23 07:25

    keil中c語言的動態(tài)分配內(nèi)存

    開辟,所以只用進(jìn)行一次內(nèi)存釋放;而第二種方法進(jìn)行了兩次動態(tài)內(nèi)存開辟,并且其中一次是對結(jié)構(gòu)體內(nèi)部成員進(jìn)行的,如果我們的代碼是在一個給別人用的函
    發(fā)表于 01-21 06:04

    新思科技助力UCIe 3.0快速落地

    芯片已從單一整體式芯片發(fā)展為集成多個芯粒的 Multi-Die 設(shè)計,其中每個芯粒針對處理、內(nèi)存和數(shù)據(jù)傳輸?shù)忍囟üδ?b class='flag-5'>進(jìn)行了優(yōu)化。
    的頭像 發(fā)表于 11-30 10:01 ?704次閱讀

    請問Keil的優(yōu)化等級到底該如何選擇?

    做任何優(yōu)化。代碼的執(zhí)行順序與源代碼完全一致,變量始終存儲在內(nèi)存中(不進(jìn)行寄存器優(yōu)化),函數(shù)調(diào)用棧幀清晰。 -O1 (有限優(yōu)化 / Opti
    發(fā)表于 11-20 07:51

    通過優(yōu)化代碼來提高M(jìn)CU運行效率

    。 內(nèi)存訪問優(yōu)化 充分利用緩存:如果MCU有Cache,盡量保證代碼和數(shù)據(jù)的局部性,即讓相關(guān)的數(shù)據(jù)在內(nèi)存中連續(xù)存放。 避免內(nèi)存碎片:在動態(tài)內(nèi)存
    發(fā)表于 11-12 08:21

    蜂鳥E203內(nèi)核優(yōu)化方法

    對蜂鳥E203內(nèi)核進(jìn)行優(yōu)化可以考慮以下幾個方面: 編譯器優(yōu)化:使用適合蜂鳥E203的編譯器選項和指令集,優(yōu)化編譯器的選項和參數(shù),開啟對硬件的
    發(fā)表于 10-21 07:55

    知道板卡廠商參與芯片研發(fā)的α階段意味著什么?

    大家知道芯片很重要,但是否知道一顆芯片從設(shè)計構(gòu)思到最終量產(chǎn),需要經(jīng)歷怎樣一個漫長的過程嗎?
    的頭像 發(fā)表于 09-24 17:08 ?7615次閱讀
    <b class='flag-5'>你</b><b class='flag-5'>知道</b>板卡廠商參與芯片研發(fā)的α階段意味著什么?

    SOLIDWORKS2025在性能和響應(yīng)速度方面進(jìn)行了大幅提升

    在工程設(shè)計領(lǐng)域,軟件的性能和響應(yīng)速度是衡量其效率與用戶體驗的重要指標(biāo)。SOLIDWORKS作為CAD軟件之一,始終致力于為用戶提供更有效、更穩(wěn)定的設(shè)計平臺。隨著solidworks2025版本的發(fā)布,其在性能和響應(yīng)速度方面實現(xiàn)了顯著提升,為全球設(shè)計師和工程師們帶來了流暢設(shè)計體驗。
    的頭像 發(fā)表于 08-06 10:25 ?1050次閱讀

    TPS62684 1600mA 高效降壓轉(zhuǎn)換器,針對小尺寸解決方案進(jìn)行了優(yōu)化數(shù)據(jù)手冊

    進(jìn)行了優(yōu)化, 支持高達(dá) 1600mA 的負(fù)載電流,并允許使用低成本的片式電感器和電容器。 該器件的輸入電壓范圍為 3.25V 至 5.5V,支持由鋰離子供電的應(yīng)用 電池以及 5V 導(dǎo)軌。
    的頭像 發(fā)表于 06-25 13:41 ?656次閱讀
    TPS62684 1600mA 高效降壓轉(zhuǎn)換器,針對小尺寸解決方案<b class='flag-5'>進(jìn)行了</b><b class='flag-5'>優(yōu)化</b>數(shù)據(jù)手冊

    請問如何優(yōu)化OpenVINO?工具套件中的內(nèi)存使用?

    運行OpenVINO?推斷時找不到優(yōu)化內(nèi)存使用情況的方法。
    發(fā)表于 06-25 06:56

    鴻蒙5開發(fā)寶藏案例分享---內(nèi)存優(yōu)化實戰(zhàn)指南

    就是的 App變卡、變慢、甚至直接閃退 !想象一下手機后臺在瘋狂“打掃衛(wèi)生”,的應(yīng)用能不卡嗎? 優(yōu)化內(nèi)存的好處: 應(yīng)用更流暢(絲滑?。?、響應(yīng)更快、系統(tǒng)資源占用少、設(shè)備續(xù)航更久(用戶
    發(fā)表于 06-12 17:15

    HarmonyOS優(yōu)化應(yīng)用內(nèi)存占用問題性能優(yōu)化

    一、使用purgeable優(yōu)化C++內(nèi)存 Purgeable Memory是HarmonyOS中native層常用的內(nèi)存管理機制,可用于圖像處理的Bitmap、流媒體應(yīng)用的一次性數(shù)據(jù)、圖片等
    發(fā)表于 05-24 17:20

    HarmonyOS優(yōu)化應(yīng)用內(nèi)存占用問題性能優(yōu)化

    一、 概述 用戶功能的不斷增強,應(yīng)用越來越復(fù)雜,占用的內(nèi)存也在不斷膨脹,而內(nèi)存作為系統(tǒng)的稀缺資源比較有限,當(dāng)應(yīng)用程序占用過多內(nèi)存時,系統(tǒng)可能會頻繁進(jìn)行內(nèi)存回收和重新分配,導(dǎo)致應(yīng)用程序的
    發(fā)表于 05-21 11:27

    SOLIDWORKS?2025在電氣設(shè)計與仿真方面進(jìn)行了優(yōu)化

    隨著科技的飛速發(fā)展,工程設(shè)計領(lǐng)域?qū)﹄姎庠O(shè)計與仿真工具的要求日益提高。SOLIDWORKS作為三維CAD設(shè)計和仿真分析軟件,始終致力于通過技術(shù)創(chuàng)新推動行業(yè)發(fā)展。2025年推出的SOLIDWORKS?2025版本,在電氣設(shè)計與仿真方面實現(xiàn)了諸多突破和優(yōu)化,為用戶提供了更加有效
    的頭像 發(fā)表于 04-25 10:46 ?935次閱讀
    SOLIDWORKS?2025在電氣設(shè)計與仿真<b class='flag-5'>方面</b><b class='flag-5'>進(jìn)行了</b><b class='flag-5'>優(yōu)化</b>

    iMX8MPlus SoC M7核心是否需要單獨的RAM內(nèi)存

    對于 iMX8MPlus SoC ,M7 核心是否需要單獨的 RAM 內(nèi)存?或者是否有用于 M7內(nèi)核的內(nèi)部 SRAM?
    發(fā)表于 03-28 08:03