欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang對struct字段重新排序優(yōu)化數據結構性能實踐

 更新時間:2023年12月15日 11:44:18   作者:俞凡  
這篇文章主要為大家介紹了Golang對struct字段重新排序優(yōu)化數據結構性能實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

通過對 struct 字段重新排序

僅僅通過對 struct 字段重新排序,優(yōu)化內存對齊方式,就可以獲得明顯的內存和執(zhí)行效率提升。

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

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

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

簡單 Demo

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

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

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

如你所見,它們在內存使用方面并不一樣。

是什么原因導致兩個完全相似的 struct 消耗的內存不同?

答案在于數據在計算機內存中的排列方式。

簡而言之,數據結構對齊。

數據結構對齊

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

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

簡而言之,CPU 以其字長的倍數讀取內存地址。

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

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

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

非常低效。

因此需要數據結構對齊,讓計算機將數據存儲在等于數據大小倍數的地址上。

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

通過簡單的對齊數據,計算機確??梢栽谝粋€ CPU 周期內檢索到變量passportNum

數據結構填充

填充是實現數據對齊的關鍵。

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

這就是額外內存的來源!

我們來回顧一下BadStructGoodStruct。

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

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

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

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

問題來了,你為什么要關心這個?

兩個方面,速度和內存使用。

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

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

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

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

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

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

結語

好了,全文到此為止,我們以一個簡單的行動呼吁來結束:一定要對 struct 結構字段進行重排序!

以上就是Golang對struct字段重新排序優(yōu)化數據結構性能實踐的詳細內容,更多關于Golang struct重新排序的資料請關注腳本之家其它相關文章!

相關文章

  • golang游戲等資源壓縮包創(chuàng)建和操作方法

    golang游戲等資源壓縮包創(chuàng)建和操作方法

    這篇文章主要介紹了golang游戲等資源壓縮包創(chuàng)建和操作,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 大多數Go程序員都走過的坑盤點解析

    大多數Go程序員都走過的坑盤點解析

    這篇文章主要為大家介紹了大多數Go程序員都走過的坑盤點解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • golang判斷文本文件是否是BOM格式的方法詳解

    golang判斷文本文件是否是BOM格式的方法詳解

    在Go語言中,我們可以通過讀取文本文件的前幾個字節(jié)來識別它是否是BOM格式的文件,BOM(Byte Order Mark)是UTF編碼標準中的一部分,用于標示文本文件的編碼順序,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • go micro集成鏈路跟蹤的方法和中間件原理解析

    go micro集成鏈路跟蹤的方法和中間件原理解析

    這篇文章主要介紹了go-micro集成鏈路跟蹤的方法和中間件原理,關于Http或者說是Restful服務的鏈路跟蹤,go-micro的httpClient支持CallWrapper,可以用WrapCall來添加鏈路跟蹤的CallWrapper,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2022-05-05
  • Go+Vue開發(fā)一個線上外賣應用的流程(用戶名密碼和圖形驗證碼)

    Go+Vue開發(fā)一個線上外賣應用的流程(用戶名密碼和圖形驗證碼)

    這篇文章主要介紹了Go+Vue開發(fā)一個線上外賣應用(用戶名密碼和圖形驗證碼),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 幾個小技巧幫你實現Golang永久阻塞

    幾個小技巧幫你實現Golang永久阻塞

    Go 的運行時的當前設計,假定程序員自己負責檢測何時終止一個 goroutine 以及何時終止該程序。有時候我們需要的是使程序阻塞在這一行,本文就來詳細的介紹一下,感興趣的可以了解一下
    2021-12-12
  • golang代碼檢測工具之goimports解讀

    golang代碼檢測工具之goimports解讀

    這篇文章主要介紹了golang代碼檢測工具之goimports使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Golang常量iota的使用實例

    Golang常量iota的使用實例

    今天小編就為大家分享一篇關于Golang常量iota的使用實例,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • goland 恢復已更改文件的操作

    goland 恢復已更改文件的操作

    這篇文章主要介紹了goland 恢復已更改文件的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • go實現腳本解釋器gscript

    go實現腳本解釋器gscript

    這篇文章主要為大家介紹了go實現腳本解釋器gscript示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07

最新評論