日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Golang數(shù)據(jù)結(jié)構(gòu)性能優(yōu)化實(shí)踐

來(lái)源: 責(zé)編: 時(shí)間:2024-01-02 09:30:41 247觀看
導(dǎo)讀如果你有Golang開(kāi)發(fā)經(jīng)驗(yàn),一定定義過(guò)struct類型。但可能你不知道,通過(guò)簡(jiǎn)單的重新排序struct字段,可以極大提高Go程序的速度和內(nèi)存使用效率!是不是難以置信?我們一起來(lái)看一下吧!簡(jiǎn)單Demotype BadStruct struct { age

如果你有Golang開(kāi)發(fā)經(jīng)驗(yàn),一定定義過(guò)struct類型。UcS28資訊網(wǎng)——每日最新資訊28at.com

但可能你不知道,通過(guò)簡(jiǎn)單的重新排序struct字段,可以極大提高Go程序的速度和內(nèi)存使用效率!UcS28資訊網(wǎng)——每日最新資訊28at.com

是不是難以置信?我們一起來(lái)看一下吧!UcS28資訊網(wǎng)——每日最新資訊28at.com

UcS28資訊網(wǎng)——每日最新資訊28at.com

簡(jiǎn)單Demo

type BadStruct struct { age         uint8 passportNum uint64 siblings    uint16}type GoodStruct struct { age         uint8 siblings    uint16 passportNum uint64}

在上面的代碼片段中,我們創(chuàng)建了兩個(gè)具有相同字段的結(jié)構(gòu)體。然后編寫一個(gè)簡(jiǎn)單程序分別輸出其內(nèi)存使用情況。UcS28資訊網(wǎng)——每日最新資訊28at.com

// OutputBad struct is 24 bytes longGood struct is 16 bytes long

如你所見(jiàn),它們?cè)趦?nèi)存使用方面并不一樣。UcS28資訊網(wǎng)——每日最新資訊28at.com

是什么原因?qū)е聝蓚€(gè)完全相似的struct消耗的內(nèi)存不同?UcS28資訊網(wǎng)——每日最新資訊28at.com

答案在于數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中的排列方式。UcS28資訊網(wǎng)——每日最新資訊28at.com

簡(jiǎn)而言之,數(shù)據(jù)結(jié)構(gòu)對(duì)齊。UcS28資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)結(jié)構(gòu)對(duì)齊

CPU以字(word)為單位讀取數(shù)據(jù),而不是字節(jié)(byte)。UcS28資訊網(wǎng)——每日最新資訊28at.com

64位系統(tǒng)中,一個(gè)word是8個(gè)字節(jié),而32位系統(tǒng)中,一個(gè)word是4個(gè)字節(jié)。UcS28資訊網(wǎng)——每日最新資訊28at.com

簡(jiǎn)而言之,CPU以其字長(zhǎng)的倍數(shù)讀取內(nèi)存地址。UcS28資訊網(wǎng)——每日最新資訊28at.com

UcS28資訊網(wǎng)——每日最新資訊28at.com

想象一下,在64位系統(tǒng)中,為了獲取變量passportNum,CPU需要兩個(gè)周期來(lái)訪問(wèn)數(shù)據(jù)。UcS28資訊網(wǎng)——每日最新資訊28at.com

第一個(gè)周期將獲取內(nèi)存的0到7字節(jié),下一個(gè)周期獲取其余內(nèi)存字節(jié)。UcS28資訊網(wǎng)——每日最新資訊28at.com

把它想象成一個(gè)筆記本,每頁(yè)只能存儲(chǔ)一個(gè)字大小的數(shù)據(jù)(在本例中為8字節(jié))。如果passportNum分散在兩個(gè)頁(yè),則需要兩次讀取才能檢索到完整的數(shù)據(jù)。UcS28資訊網(wǎng)——每日最新資訊28at.com

非常低效。UcS28資訊網(wǎng)——每日最新資訊28at.com

因此需要數(shù)據(jù)結(jié)構(gòu)對(duì)齊,讓計(jì)算機(jī)將數(shù)據(jù)存儲(chǔ)在等于數(shù)據(jù)大小倍數(shù)的地址上。UcS28資訊網(wǎng)——每日最新資訊28at.com

UcS28資訊網(wǎng)——每日最新資訊28at.com

4字節(jié)數(shù)據(jù)只能從內(nèi)存地址0或4開(kāi)始UcS28資訊網(wǎng)——每日最新資訊28at.com

例如,2字節(jié)數(shù)據(jù)可以存儲(chǔ)在內(nèi)存0、2或4中,而4字節(jié)數(shù)據(jù)可以存儲(chǔ)在內(nèi)存0、4或8中。UcS28資訊網(wǎng)——每日最新資訊28at.com

UcS28資訊網(wǎng)——每日最新資訊28at.com

通過(guò)簡(jiǎn)單的對(duì)齊數(shù)據(jù),計(jì)算機(jī)確保可以在一個(gè)CPU周期內(nèi)檢索到變量passportNum。UcS28資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)結(jié)構(gòu)填充

填充是實(shí)現(xiàn)數(shù)據(jù)對(duì)齊的關(guān)鍵。UcS28資訊網(wǎng)——每日最新資訊28at.com

計(jì)算機(jī)通過(guò)在數(shù)據(jù)結(jié)構(gòu)之間填充額外的字節(jié),從而對(duì)齊字段。UcS28資訊網(wǎng)——每日最新資訊28at.com

這就是額外內(nèi)存的來(lái)源!UcS28資訊網(wǎng)——每日最新資訊28at.com

我們來(lái)回顧一下BadStruct和GoodStruct。UcS28資訊網(wǎng)——每日最新資訊28at.com

UcS28資訊網(wǎng)——每日最新資訊28at.com

GoodStruct消耗更少的內(nèi)存,僅僅因?yàn)榕cBadStruct相比,其struct字段順序更合理。UcS28資訊網(wǎng)——每日最新資訊28at.com

由于填充,兩個(gè)13字節(jié)的數(shù)據(jù)結(jié)構(gòu)分別變成了16字節(jié)和24字節(jié)。UcS28資訊網(wǎng)——每日最新資訊28at.com

因此,可以僅僅通過(guò)對(duì)struct字段重新排序來(lái)節(jié)省額外的內(nèi)存!UcS28資訊網(wǎng)——每日最新資訊28at.com

這種優(yōu)化為什么重要?

問(wèn)題來(lái)了,你為什么要關(guān)心這個(gè)?UcS28資訊網(wǎng)——每日最新資訊28at.com

兩個(gè)方面,速度和內(nèi)存使用。UcS28資訊網(wǎng)——每日最新資訊28at.com

我們做一個(gè)簡(jiǎn)單的基準(zhǔn)測(cè)試來(lái)證明!UcS28資訊網(wǎng)——每日最新資訊28at.com

func traverseGoodStruct() uint16 { var arbitraryNum uint16   for _, goodStruct := range GoodStructArr {  arbitraryNum += goodStruct.siblings }   return arbitraryNum}func traverseBadStruct() uint16 { var arbitraryNum uint16   for _, badStruct := range BadStructArr {  arbitraryNum += badStruct.siblings }   return arbitraryNum}func BenchmarkTraverseGoodStruct(b *testing.B) { for n := 0; n < b.N; n++ {  traverseGoodStruct() }}func BenchmarkTraverseBadStruct(b *testing.B) { for n := 0; n < b.N; n++ {  traverseBadStruct() }}

對(duì)GoodStruct和BadStruct進(jìn)行基準(zhǔn)測(cè)試的方法是循環(huán)遍歷數(shù)組,并將struct字段累加到變量中。UcS28資訊網(wǎng)——每日最新資訊28at.com

UcS28資訊網(wǎng)——每日最新資訊28at.com

從結(jié)果中可以看出,遍歷GoodStruct確實(shí)比BadStruct花費(fèi)時(shí)間更少。UcS28資訊網(wǎng)——每日最新資訊28at.com

對(duì)struct字段重排序可以優(yōu)化應(yīng)用程序的內(nèi)存使用和速度。UcS28資訊網(wǎng)——每日最新資訊28at.com

想象一下,維護(hù)一個(gè)具有大量結(jié)構(gòu)體的大型應(yīng)用程序,改變將會(huì)更為明顯。UcS28資訊網(wǎng)——每日最新資訊28at.com

結(jié)語(yǔ)

好了,全文到此為止,我們以一個(gè)簡(jiǎn)單的行動(dòng)呼吁來(lái)結(jié)束:一定要對(duì)struct結(jié)構(gòu)字段進(jìn)行重排序!UcS28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-55123-0.htmlGolang數(shù)據(jù)結(jié)構(gòu)性能優(yōu)化實(shí)踐

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 通過(guò)Uri加載raw目錄下的文件

下一篇: “推薦大戰(zhàn):抖音vs.快手”——背后的秘密全揭曉!

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 小米平板5 Pro 12.4簡(jiǎn)評(píng):多專多能 兼顧影音娛樂(lè)的大屏利器

    疫情帶來(lái)了網(wǎng)課,網(wǎng)課盤活了安卓平板,安卓平板市場(chǎng)雖然中途停滯了幾年,但好的一點(diǎn)就是停滯的這幾年行業(yè)又有了新的發(fā)展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • 28個(gè)SpringBoot項(xiàng)目中常用注解,日常開(kāi)發(fā)、求職面試不再懵圈

    前言在使用SpringBoot開(kāi)發(fā)中或者在求職面試中都會(huì)使用到很多注解或者問(wèn)到注解相關(guān)的知識(shí)。本文主要對(duì)一些常用的注解進(jìn)行了總結(jié),同時(shí)也會(huì)舉出具體例子,供大家學(xué)習(xí)和參考。注解
  • 2023 年的 Node.js 生態(tài)系統(tǒng)

    隨著技術(shù)的不斷演進(jìn)和創(chuàng)新,Node.js 在 2023 年達(dá)到了一個(gè)新的高度。Node.js 擁有一個(gè)龐大的生態(tài)系統(tǒng),可以幫助開(kāi)發(fā)人員更快地實(shí)現(xiàn)復(fù)雜的應(yīng)用。本文就來(lái)看看 Node.js 最新的生
  • Flowable工作流引擎的科普與實(shí)踐

    一.引言當(dāng)我們?cè)谌粘9ぷ骱蜆I(yè)務(wù)中需要進(jìn)行各種審批流程時(shí),可能會(huì)面臨一系列技術(shù)和業(yè)務(wù)上的挑戰(zhàn)。手動(dòng)處理這些審批流程可能會(huì)導(dǎo)致開(kāi)發(fā)成本的增加以及業(yè)務(wù)復(fù)雜度的上升。在這
  • 破圈是B站頭上的緊箍咒

    來(lái)源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準(zhǔn)追劇女孩們的古偶劇集,2021年有優(yōu)酷的《山河令》,2022年有愛(ài)奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 自律,給不了Keep自由!

    來(lái)源 | 互聯(lián)網(wǎng)品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時(shí)不好說(shuō),但大概率不能給Keep自由。近日,全球最大的在線健身平臺(tái)Keep正式登陸港交所,努力
  • “又被陳思誠(chéng)騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國(guó)產(chǎn)懸疑電影,成了陳思誠(chéng)的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠(chéng)再度風(fēng)頭無(wú)兩。你可以說(shuō)陳思誠(chéng)的
  • 自研Exynos回歸!三星Galaxy S24系列將提供Exynos和驍龍雙版本

    年初,全新的三星Galaxy S23系列發(fā)布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三個(gè)版本,全系搭載超頻版驍龍8 Gen 2,雖同樣采用臺(tái)積電4nm工藝制
  • onebot M24巧系列一體機(jī)采用輕薄機(jī)身設(shè)計(jì),現(xiàn)已在各平臺(tái)開(kāi)售

    onebot M24 巧系列一體機(jī)目前已在線上線下各平臺(tái)同步開(kāi)售。onebot M24 巧系列采用一體化輕薄機(jī)身設(shè)計(jì),最薄處為 10.15mm,擁有寶石紅、午夜藍(lán)、石墨綠、雅致
Top 主站蜘蛛池模板: 左贡县| 都江堰市| 黑河市| 海城市| 额济纳旗| 株洲市| 磴口县| 刚察县| 资溪县| 延长县| 莒南县| 乌恰县| 贡山| 仪征市| 铅山县| 柳州市| 健康| 栾城县| 呼玛县| 新巴尔虎左旗| 晋江市| 淮安市| 巩义市| 讷河市| 磴口县| 华蓥市| 卢氏县| 泉州市| 右玉县| 安西县| 丹凤县| 罗山县| 肥乡县| 十堰市| 花莲县| 肇东市| 台山市| 宽城| 武邑县| 福清市| 谢通门县|