AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

Golang數據結構性能優化實踐

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

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

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

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

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

簡單Demo

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

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

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

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

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

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

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

數據結構對齊

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

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

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

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

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

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

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

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

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

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

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

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

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

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

數據結構填充

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

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

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

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

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

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

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

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

這種優化為什么重要?

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

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

我們做一個簡單的基準測試來證明!3tK28資訊網——每日最新資訊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字段累加到變量中。3tK28資訊網——每日最新資訊28at.com

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

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

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

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

結語

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

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

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

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

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

標簽:
  • 熱門焦點
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • Raft算法:保障分布式系統共識的穩健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可復制、可冗余、可容錯”)的首字母縮寫。Raft算法是一種用于在分布式系統
  • Flowable工作流引擎的科普與實踐

    一.引言當我們在日常工作和業務中需要進行各種審批流程時,可能會面臨一系列技術和業務上的挑戰。手動處理這些審批流程可能會導致開發成本的增加以及業務復雜度的上升。在這
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現百度,功能雖然實現了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 阿里瓴羊One推出背后,零售企業迎數字化新解

    作者:劉曠近年來隨著數字經濟的高速發展,各式各樣的SaaS應用服務更是層出不窮,但本質上SaaS大多局限于單一業務流層面,對用戶核心關切的增長問題等則沒有提供更好的解法。在Saa
  • 造車兩年股價跌六成,小米的估值邏輯變了嗎?

    如果從小米官宣造車后的首個交易日起持有小米集團的股票,那么截至2023年上半年最后一個交易日,投資者將浮虧59.16%,同區間的恒生科技指數跌幅為52.78%
  • iQOO 11S或7月上市:搭載“雞血版”驍龍8Gen2 史上最強5G Soc

    去年底,iQOO推出了“電競旗艦”iQOO 11系列,作為一款性能強機,iQOO 11不僅全球首發2K 144Hz E6全感屏,搭載了第二代驍龍8平臺及144Hz電競屏,同時在快充
  • AI藝術欣賞體驗會在上海梅賽德斯奔馳中心音樂俱樂部上演

    光影交錯的鏡像世界,虛實幻化的視覺奇觀,虛擬偶像與真人共同主持,這些場景都出現在2019世界人工智能大會的舞臺上。8月29日至31日,“AI藝術欣賞體驗會”在上海
Top