Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

[Golang] การจัดเรียง property ใน Struct เพื่อลดจำนวน memory ที่ใช้งาน

$
0
0

วันนี้น้องในทีมมาถามเรื่อง 
การใช้งาน memory ของ struct ในภาษา Go
ซึ่งมีเรื่องของ Alignment และ Padding ที่อาจจะดูงง ๆ
เลยลองไปเปิดเอกสารของภาษา Go ดูกันหน่อย
ได้ความว่า

ลำดับของ property ใน Struct

มีผลต่อขนาดของ memory ที่ใช้งานด้วย
ซึ่งถ้าเราจัดการดี ๆ หรือมีความเข้าใจดี ๆ แล้ว
ก็จะช่วยทำให้ระบบงานของเราใช้ memory น้อยลงไปด้วย
น่าจะมีประโยชน์พอสมควรเลย
ปล. ใช้งานบน Architecture แบบ 64 bit

เริ่มด้วย code ประมาณนี้

[gist id="612846d0fb82f1ee63b8d37984d25cb5" file="1.go"]

ผลที่ได้คือ Struct นั้นจะใช้หน่วยความจำไป 24 byte

ทำไมถึงใช้ถึง 24 byte ?
เนื่องจากลองบวกขนาดของ data type ใน struct แล้วไม่ถึงนะ
คือ 1 + 8 + 4 =  13 byte เท่านั้น !!!

เมื่อลองไปอ่านเอกสารดูพบว่า

แต่ละตัวแปรใน Struct นั้น (สำหรับ Architecture แบบ 64 bit)
จะทำการ padding ทุก ๆ  8 byte เสมอ
ทำให้ผลรวมของการจองหน่วนความจำคือ 24 byte นั่นเอง
ทำให้การจองพื้นที่ในหน่วยความจำเป็นดังนี้

จะเห็นว่าตัวแปรชนิด float64 จะใช้พื้นที่ขนาด 8 byte
ซึ่งใหญ่กว่าที่มีให้หลังจากที่ boolean ในไป 1 byte
ทำให้ต้องไปจองเพิ่มอีก 8 byte ตามรูปแบบการจองหน่วยความจำ (Allocate memory)

คำถามคือ จะลดขนาดของหน่วยความจำที่ใช้ลงไปอย่างไร ?

ง่าย ๆ คือ เปลี่ยนลำดับของ property ใน Struct ไงละ !!
ยกตัวอย่างเช่น จะเหลือเพียง 16 byte เท่านั้น

[gist id="612846d0fb82f1ee63b8d37984d25cb5" file="2.go"]

แสดงดังรูป

เพียงแค่เปลี่ยนลำดับ ชีวิตก็เปลี่ยนเลย
ประเด็นหลัก ๆ คือ  เพียงเรื่องเล็ก ๆ น้อย ๆ นั้น
มันช่วยให้เราปรับปรุงประสิทธิภาพการทำงานของระบบได้มากขึ้นแล้ว
ลองนำไปใช้กันดูนะครับ

Reference Websites


Viewing all articles
Browse latest Browse all 1997

Trending Articles