最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang對struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實踐

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

通過對 struct 字段重新排序

僅僅通過對 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ù)的地址上。

例如,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)存的來源!

我們來回顧一下BadStructGoodStruct。

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

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

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

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

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

結(jié)語

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

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

相關(guān)文章

  • Go基礎(chǔ)教程系列之數(shù)據(jù)類型詳細說明

    Go基礎(chǔ)教程系列之數(shù)據(jù)類型詳細說明

    這篇文章主要介紹了Go基礎(chǔ)教程系列之數(shù)據(jù)類型詳細說明,需要的朋友可以參考下
    2022-04-04
  • 淺談Go語言多態(tài)的實現(xiàn)與interface使用

    淺談Go語言多態(tài)的實現(xiàn)與interface使用

    如果大家系統(tǒng)的學過C++、Java等語言以及面向?qū)ο蟮脑?,相信?yīng)該對多態(tài)不會陌生。多態(tài)是面向?qū)ο蠓懂牣斨薪?jīng)常使用并且非常好用的一個功能,它主要是用在強類型語言當中,像是Python這樣的弱類型語言,變量的類型可以隨意變化,也沒有任何限制,其實區(qū)別不是很大
    2021-06-06
  • Go語言中內(nèi)存泄漏的常見案例與解決方法

    Go語言中內(nèi)存泄漏的常見案例與解決方法

    Go雖然是自動GC類型的語言,但在編碼過程中如果不注意,很容易造成內(nèi)存泄漏的問題,本文為大家整理了一些內(nèi)存泄漏的常見Case與解決方法,希望對大家有所幫助
    2024-03-03
  • Go項目中使用Casbin實現(xiàn)RBAC權(quán)限管理教程

    Go項目中使用Casbin實現(xiàn)RBAC權(quán)限管理教程

    本文主要介紹了Go項目中使用Casbin實現(xiàn)RBAC權(quán)限管理教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-01-01
  • Go語言標準輸入輸出庫的基本使用教程

    Go語言標準輸入輸出庫的基本使用教程

    輸入輸出在任何一門語言中都必須提供的一個功能,下面這篇文章主要給大家介紹了關(guān)于Go語言標準輸入輸出庫的基本使用,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • Golang實現(xiàn)請求限流的幾種辦法(小結(jié))

    Golang實現(xiàn)請求限流的幾種辦法(小結(jié))

    這篇文章主要介紹了Golang實現(xiàn)請求限流的幾種辦法(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • 一文詳解在Go中如何使用Viper來管理配置

    一文詳解在Go中如何使用Viper來管理配置

    Viper 是一個功能齊全的 Go 應(yīng)用程序配置庫,支持很多場景。在本文中,我們將深入探討 Viper 的各種用法和使用場景,以幫助讀者更好地了解和使用 Viper 來管理應(yīng)用程序配置,感興趣的同學可以參考閱讀
    2023-05-05
  • Go語言七篇入門教程五文件及包

    Go語言七篇入門教程五文件及包

    本章節(jié)主要介紹go語言的文件處理與包管理,本文是Go語言七篇入門教程系列篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • go 壓縮解壓zip文件源碼示例

    go 壓縮解壓zip文件源碼示例

    這篇文章主要為大家介紹了go壓縮及解壓zip文件的源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go語言中的速率限流策略全面詳解

    Go語言中的速率限流策略全面詳解

    這篇文章主要為大家介紹了Go語言中的速率限流策略全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11

最新評論

长春市| 西和县| 昂仁县| 东乌| 比如县| 霍邱县| 汶上县| 吉水县| 肥乡县| 长顺县| 喀喇| 吉林市| 九寨沟县| 吉安市| 南昌市| 登封市| 濉溪县| 怀宁县| 景泰县| 大连市| 叶城县| 航空| 永州市| 资溪县| 怀柔区| 张家界市| 玛多县| 开鲁县| 巴彦县| 北海市| 沧源| 准格尔旗| 麻阳| 西乌| 澜沧| 涞水县| 张家界市| 三台县| 清苑县| 汉寿县| 南通市|