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

當前位置:首頁 > 科技  > 軟件

Golang數據結構性能優化實踐

來源: 責編: 時間:2024-01-02 09:30:41 231觀看
導讀如果你有Golang開發經驗,一定定義過struct類型。但可能你不知道,通過簡單的重新排序struct字段,可以極大提高Go程序的速度和內存使用效率!是不是難以置信?我們一起來看一下吧!簡單Demotype BadStruct struct { age

如果你有Golang開發經驗,一定定義過struct類型。EOD28資訊網——每日最新資訊28at.com

但可能你不知道,通過簡單的重新排序struct字段,可以極大提高Go程序的速度和內存使用效率!EOD28資訊網——每日最新資訊28at.com

是不是難以置信?我們一起來看一下吧!EOD28資訊網——每日最新資訊28at.com

EOD28資訊網——每日最新資訊28at.com

簡單Demo

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

在上面的代碼片段中,我們創建了兩個具有相同字段的結構體。然后編寫一個簡單程序分別輸出其內存使用情況。EOD28資訊網——每日最新資訊28at.com

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

如你所見,它們在內存使用方面并不一樣。EOD28資訊網——每日最新資訊28at.com

是什么原因導致兩個完全相似的struct消耗的內存不同?EOD28資訊網——每日最新資訊28at.com

答案在于數據在計算機內存中的排列方式。EOD28資訊網——每日最新資訊28at.com

簡而言之,數據結構對齊。EOD28資訊網——每日最新資訊28at.com

數據結構對齊

CPU以字(word)為單位讀取數據,而不是字節(byte)。EOD28資訊網——每日最新資訊28at.com

64位系統中,一個word是8個字節,而32位系統中,一個word是4個字節。EOD28資訊網——每日最新資訊28at.com

簡而言之,CPU以其字長的倍數讀取內存地址。EOD28資訊網——每日最新資訊28at.com

EOD28資訊網——每日最新資訊28at.com

想象一下,在64位系統中,為了獲取變量passportNum,CPU需要兩個周期來訪問數據。EOD28資訊網——每日最新資訊28at.com

第一個周期將獲取內存的0到7字節,下一個周期獲取其余內存字節。EOD28資訊網——每日最新資訊28at.com

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

非常低效。EOD28資訊網——每日最新資訊28at.com

因此需要數據結構對齊,讓計算機將數據存儲在等于數據大小倍數的地址上。EOD28資訊網——每日最新資訊28at.com

EOD28資訊網——每日最新資訊28at.com

4字節數據只能從內存地址0或4開始EOD28資訊網——每日最新資訊28at.com

例如,2字節數據可以存儲在內存0、2或4中,而4字節數據可以存儲在內存0、4或8中。EOD28資訊網——每日最新資訊28at.com

EOD28資訊網——每日最新資訊28at.com

通過簡單的對齊數據,計算機確保可以在一個CPU周期內檢索到變量passportNum。EOD28資訊網——每日最新資訊28at.com

數據結構填充

填充是實現數據對齊的關鍵。EOD28資訊網——每日最新資訊28at.com

計算機通過在數據結構之間填充額外的字節,從而對齊字段。EOD28資訊網——每日最新資訊28at.com

這就是額外內存的來源!EOD28資訊網——每日最新資訊28at.com

我們來回顧一下BadStruct和GoodStruct。EOD28資訊網——每日最新資訊28at.com

EOD28資訊網——每日最新資訊28at.com

GoodStruct消耗更少的內存,僅僅因為與BadStruct相比,其struct字段順序更合理。EOD28資訊網——每日最新資訊28at.com

由于填充,兩個13字節的數據結構分別變成了16字節和24字節。EOD28資訊網——每日最新資訊28at.com

因此,可以僅僅通過對struct字段重新排序來節省額外的內存!EOD28資訊網——每日最新資訊28at.com

這種優化為什么重要?

問題來了,你為什么要關心這個?EOD28資訊網——每日最新資訊28at.com

兩個方面,速度和內存使用。EOD28資訊網——每日最新資訊28at.com

我們做一個簡單的基準測試來證明!EOD28資訊網——每日最新資訊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() }}

對GoodStruct和BadStruct進行基準測試的方法是循環遍歷數組,并將struct字段累加到變量中。EOD28資訊網——每日最新資訊28at.com

EOD28資訊網——每日最新資訊28at.com

從結果中可以看出,遍歷GoodStruct確實比BadStruct花費時間更少。EOD28資訊網——每日最新資訊28at.com

對struct字段重排序可以優化應用程序的內存使用和速度。EOD28資訊網——每日最新資訊28at.com

想象一下,維護一個具有大量結構體的大型應用程序,改變將會更為明顯。EOD28資訊網——每日最新資訊28at.com

結語

好了,全文到此為止,我們以一個簡單的行動呼吁來結束:一定要對struct結構字段進行重排序!EOD28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-55105-0.htmlGolang數據結構性能優化實踐

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Go語言中的性能考慮和優化

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

標簽:
  • 熱門焦點
  • 6月iOS設備好評榜:第一蟬聯榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • 跑分安卓第一!Redmi K60至尊版8月發布!盧偉冰:目標年度性能之王

    8月5日消息,Redmi K60至尊版將于8月發布,在此前舉行的戰略發布會上,官方該機將搭載搭載天璣9200+處理器,安兔兔V10跑分超177萬分,是目前安卓陣營最高的分數
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 如何使用JavaScript創建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經瀏覽過購物網站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區域,以便瀏覽。結合這個小小的重要功能可以大大改善您網站的用戶體驗
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 自研Exynos回歸!三星Galaxy S24系列將提供Exynos和驍龍雙版本

    年初,全新的三星Galaxy S23系列發布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三個版本,全系搭載超頻版驍龍8 Gen 2,雖同樣采用臺積電4nm工藝制
  • iQOO Neo8 Pro評測:旗艦雙芯加持 最強性能游戲旗艦

    【Techweb評測】去年10月,iQOO推出了一款Neo7手機,該機搭載了聯發科天璣9000+,配備獨顯芯片Pro+,帶來了同價位段最佳的游戲體驗,一經上市便受到了諸多用
  • 榮耀Magic4 至臻版 首創智慧隱私通話 強勁影音系統

    2022年第一季度臨近尾聲,在該季度內,許多品牌陸續發布自己的最新產品,讓大家從全新的角度來了解當今的手機技術。手機是電子設備中,更新迭代十分迅速的一款產品,基
Top 主站蜘蛛池模板: 珲春市| 张家港市| 南宫市| 山阳县| 邵阳市| 临清市| 浙江省| 迁西县| 龙岩市| 桦甸市| 朝阳区| 黔西县| 朔州市| 和政县| 东明县| 临夏县| 睢宁县| 儋州市| 绥阳县| 满洲里市| 潮安县| 元阳县| 宜君县| 边坝县| 德阳市| 敦煌市| 尼木县| 沾益县| 慈利县| 兴国县| 兴城市| 图片| 通城县| 邯郸市| 双牌县| 怀仁县| 英山县| 平利县| 阿尔山市| 青岛市| 合阳县|