成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 系統(tǒng)
僅僅通過對struct字段重新排序,優(yōu)化內(nèi)存對齊方式,就可以獲得明顯的內(nèi)存和執(zhí)行效率提升。

如果你有Golang開發(fā)經(jīng)驗,一定定義過struct類型。

但可能你不知道,通過簡單的重新排序struct字段,可以極大提高Go程序的速度和內(nèi)存使用效率!

是不是難以置信?我們一起來看一下吧!

簡單Demo

type BadStruct struct {
 age         uint8
 passportNum uint64
 siblings    uint16
}

type GoodStruct struct {
 age         uint8
 siblings    uint16
 passportNum uint64
}

在上面的代碼片段中,我們創(chuàng)建了兩個具有相同字段的結(jié)構(gòu)體。然后編寫一個簡單程序分別輸出其內(nèi)存使用情況。

// Output
Bad struct is 24 bytes long
Good struct is 16 bytes long

如你所見,它們在內(nèi)存使用方面并不一樣。

是什么原因?qū)е聝蓚€完全相似的struct消耗的內(nèi)存不同?

答案在于數(shù)據(jù)在計算機內(nèi)存中的排列方式。

簡而言之,數(shù)據(jù)結(jié)構(gòu)對齊。

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

CPU以字(word)為單位讀取數(shù)據(jù),而不是字節(jié)(byte)。

64位系統(tǒng)中,一個word是8個字節(jié),而32位系統(tǒng)中,一個word是4個字節(jié)。

簡而言之,CPU以其字長的倍數(shù)讀取內(nèi)存地址。

想象一下,在64位系統(tǒng)中,為了獲取變量passportNum,CPU需要兩個周期來訪問數(shù)據(jù)。

第一個周期將獲取內(nèi)存的0到7字節(jié),下一個周期獲取其余內(nèi)存字節(jié)。

把它想象成一個筆記本,每頁只能存儲一個字大小的數(shù)據(jù)(在本例中為8字節(jié))。如果passportNum分散在兩個頁,則需要兩次讀取才能檢索到完整的數(shù)據(jù)。

非常低效。

因此需要數(shù)據(jù)結(jié)構(gòu)對齊,讓計算機將數(shù)據(jù)存儲在等于數(shù)據(jù)大小倍數(shù)的地址上。

4字節(jié)數(shù)據(jù)只能從內(nèi)存地址0或4開始

例如,2字節(jié)數(shù)據(jù)可以存儲在內(nèi)存0、2或4中,而4字節(jié)數(shù)據(jù)可以存儲在內(nèi)存0、4或8中。

通過簡單的對齊數(shù)據(jù),計算機確保可以在一個CPU周期內(nèi)檢索到變量passportNum。

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

填充是實現(xiàn)數(shù)據(jù)對齊的關(guān)鍵。

計算機通過在數(shù)據(jù)結(jié)構(gòu)之間填充額外的字節(jié),從而對齊字段。

這就是額外內(nèi)存的來源!

我們來回顧一下BadStruct和GoodStruct。

GoodStruct消耗更少的內(nèi)存,僅僅因為與BadStruct相比,其struct字段順序更合理。

由于填充,兩個13字節(jié)的數(shù)據(jù)結(jié)構(gòu)分別變成了16字節(jié)和24字節(jié)。

因此,可以僅僅通過對struct字段重新排序來節(jié)省額外的內(nèi)存!

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

問題來了,你為什么要關(guān)心這個?

兩個方面,速度和內(nèi)存使用。

我們做一個簡單的基準測試來證明!

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()
 }
}

對GoodStruct和BadStruct進行基準測試的方法是循環(huán)遍歷數(shù)組,并將struct字段累加到變量中。

從結(jié)果中可以看出,遍歷GoodStruct確實比BadStruct花費時間更少。

對struct字段重排序可以優(yōu)化應用程序的內(nèi)存使用和速度。

想象一下,維護一個具有大量結(jié)構(gòu)體的大型應用程序,改變將會更為明顯。

結(jié)語

好了,全文到此為止,我們以一個簡單的行動呼吁來結(jié)束:

一定要對struct結(jié)構(gòu)字段進行重排序!

參考資料

[1]How to Speed Up Your Struct in Golang: https://betterprogramming.pub/how-to-speed-up-your-struct-in-golang-76b846209587

責任編輯:趙寧寧 來源: DeepNoMind
相關(guān)推薦

2023-12-30 14:05:32

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

2023-11-19 23:24:21

Golang開發(fā)

2020-03-23 15:15:57

MySQL性能優(yōu)化數(shù)據(jù)庫

2022-12-28 20:11:25

圖數(shù)據(jù)庫

2020-07-17 19:55:50

Vue前端性能優(yōu)化

2017-01-04 10:27:49

2010-07-06 09:07:09

2023-10-31 08:51:25

數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù)

2011-03-31 15:41:51

Cacti數(shù)據(jù)表結(jié)構(gòu)

2012-04-28 14:21:47

Java數(shù)據(jù)結(jié)構(gòu)線性結(jié)構(gòu)

2019-08-02 11:28:45

HadoopYARN調(diào)度系統(tǒng)

2021-09-24 14:02:53

性能優(yōu)化實踐

2022-10-28 13:41:51

字節(jié)SDK監(jiān)控

2011-10-08 12:55:36

紅帽GlusterFS

2023-09-05 10:16:02

Java框架

2024-03-19 09:24:00

大數(shù)據(jù)數(shù)據(jù)分析性能優(yōu)化

2021-05-12 14:09:35

鏈表數(shù)據(jù)結(jié)構(gòu)線性結(jié)構(gòu)

2020-10-21 14:57:04

數(shù)據(jù)結(jié)構(gòu)算法圖形

2022-03-29 13:27:22

Android優(yōu)化APP

2021-08-03 10:24:59

數(shù)據(jù)跳躍鏈表結(jié)構(gòu)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 天天久 | 中文一区二区视频 | 亚洲区一| 香蕉一区 | 日韩在线一区二区三区 | 国产日韩欧美一区二区 | 天天操天天射综合网 | 91看片网| 欧美天堂 | 色综合99| 国产资源在线播放 | 亚洲欧美一区二区在线观看 | 四虎最新地址 | 国产精品永久久久久久久www | 特级黄一级播放 | 奇米超碰在线 | 午夜影院中文字幕 | 日韩字幕一区 | 亚洲精品一二三区 | 亚洲日韩视频 | xxx视频| 国产激情一区二区三区 | 精品国产一区二区三区在线观看 | 久久久成人网 | 不卡一区 | 91传媒在线播放 | 男女网站在线观看 | 久草欧美 | 伊人焦久影院 | 国产一区二区精品在线 | 国产精品伦一区二区三级视频 | 精品在线免费观看视频 | 免费在线观看一区二区 | 中文字幕国产第一页 | 国产9999精品 | 国产中文字幕在线观看 | 午夜精品久久久久久久久久久久久 | 欧美精品在欧美一区二区少妇 | 欧美视频区 | 五月综合激情在线 | 成人亚洲精品 |