大家好,地鼠們!在使用 Golang 的第一年裡,我一直在想字段必須有順序,我想我為什麼要為此煩惱呢?好吧,這只是字段,可能只是出了什麼問題,我對嗎?和大多數其他新手一樣,我認為這不值得費心。換句話說,結構體中的某些欄位以特定順序放置有多重要?嗯,很不錯!
欄位排序是一開始被忽略的方面之一,但隨著教程的繼續,這種理解,特別是 Go 如何使用指針,被認為是非常關鍵的。實際上,在提高應用程式效能時,尤其是在處理大型資料集或佔用記憶體過多的操作時,正是這個順序至關重要。這個不幸的缺陷將透過更好地理解為什麼它對於 Go 字段排序如此重要而得到彌補。
當放置在記憶體中時,結構體被表示為一塊連續的記憶體區塊,其中所有欄位根據其在結構體中的定義依序定位。這可能看起來相當簡單,但這種線性組織也發揮了一些相當重要的作用,特別是在記憶體對齊和填充等領域。
記憶體對齊是關於如何從記憶體放置和存取資料的。通常,CPUS 在記憶體中獲取資料的位置方面可能存在偏差,稱為對齊邊界。例如,應從第 4 個位元組位址放置或取出 32 位元整數。如果結構體中存在未正確對齊的字段,則翻閱頁面時,Go 編譯器可能會新增填充位元組等。這變得相當浪費。例如,看看這個結構體。
struct example{ a bool // 1 byte b int32 // 4bytes; c bool // 1byte d int64 //8 bytes }
由於對齊規則,在這個不正確的結構中,Go 編譯器可能會在這些欄位的中間添加一個或多個填充位元組:
a 是 1 個字節,但 b 需要 4 個位元組 對齊,因此插入填充 3 個位元組
b 長度為 4bytes
c 長度為 1 個位元組 但為了對齊需要 8 個位元組的 d,需要 7asing,因此引入了填充。
d 長度為 8 位元組
木材如何成為結構木材,由於腿的原因,尺寸仍然是24,儘管內容只需要14但是看看實際內容的體積加上填充物的體積.
欄位順序和結構查找有助於避免以負邊距形式浪費空間。換句話說:
type Example struct { d int64 // 8 bytes b int32 // 4 bytes a bool // 1 byte c bool // 1 byte }
上面優化後的結構體中:
d佔用8位元組.
b佔用4個位元組.
a和c各佔用1個字節,無需填充。
此結構現在只有 16 位元組 大小,比以前的 24 位元組 大小的結構更好。
當人們考慮常見的小型應用程式時,他或她很可能會發現應用程式使用的記憶體量與後者沒有什麼不同。然而,在性能甚至記憶體空間都至關重要的結構中,情況並非如此,考慮到嵌入式系統、超快速高頻交易應用程式或旨在處理大量資料的應用程序,這些忠實的限制可以快速增加。當使用許多大型數組或連接的結構切片來構造或操作時,這一點變得更加明顯。當結構的容量僅高出幾個位元組時,就不容易注意到偏差或負載聯合。當低記憶體架構大規模生產時,需要處理數百萬個實例,一點一點地,這種令人上癮的過度浪費不再是聞所未聞的。
排序欄位不僅從 Golang 結構設計的角度來看很好,而且在記憶體優化中也發揮著重要作用。了解 Go 如何為結構及其像素進行記憶體佈局的這一方面可以在實踐中實現更有效的結構設計。當涉及大量使用記憶體的應用程式時,這種微不足道的調整可能會帶來相當大的效能提升。當您下次有機會在 Go 中定義結構體時,不要只是將這些欄位溢出。相反,花一分鐘考慮一下順序 - 在未來的日子裡你會感謝你自己和你的申請!
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3