จากบทความของ Cloudflare
เรื่อง How we saved 100 terabytes of memory by optimizing 1.1.1.1’s DNS cache
ทำการอธิบายวิธีการลดการใช้งาน memory
ด้วยการเปลี่ยนการจัดเก็บข้อมูลจาก type Vec[T> ไปเป็นBox<[T]>
ซึ่งผมก็ไม่ค่อยรู้เรื่องเท่าไร
ดังนั้นมาลองเขียน code เพื่อทดลองดูหน่อย
น่าจะทำให้เข้าใจมากยิ่งขึ้น

เริ่มจากการเก็บข้อมูลของ Vec[T] ก่อน หรือ vector นั่นเอง

จะทำการเก็บข้อมูล 3 field คือ

  • ptr คือ pointer ที่ชีไปยังตำแหน่งของข้อมูลที่จัดเก็บใน heap
  • len คือ ความยาวของข้อมูล
  • capacity คือ พื้นที่ว่างที่จองเอาไว้ในการเพิ่มข้อมูลในอนาคต ดังนั้นถ้ายังไม่ถูกใช้งานก็ยังต้องจองไว้เสมอ

และใช้งาน Vec ใน response ของการทำงานอีกด้วย
ซึ่งแน่นอนว่า response จะไม่ถูกแก้ไขแน่นอน
ดังนั้นเราจะเสีย memory ในส่วนของ capacity ไปเฉย ๆ !!

ดังนั้นในส่วนนี้ทาง Cloudflare จึงได้ทำการเปลี่ยนไปใช้งาน Box<[T]> หรือ box slice

ซึ่ง Box นั้นจะไม่สามารถขยายได้หลังจากสร้าง
ดังนั้นไม่จำเป็นต้องมีการเก็บ capacity

เพื่อให้เข้าใจความแตกต่างจึงลองเขียน code และดู memory ที่ใช้งานกันหน่อย

เริ่มด้วยการใช้งาน Vec และ Box

และเปลี่ยนมาใช้งาน Box

จากนั้นลองทำการสร้าง object ของทั้งคู่ขึ้นมา

และสุดท้ายของ debug และ print memory ที่ใช้งาน
เพื่อเปรียบเทียบว่าจริงหรือไม่ ?

พบว่าลดจริง ๆ ด้วย แถวลดเยอะมาก ๆ
น่าสนใจจริง ๆ สำหรับการ optimize code ในลักษณะนี้
เล็ก ๆ น้อย ๆ แต่ได้ผลที่เยอะน่าดู
ลองศึกษาและใช้งานกันดูครับ
ขอให้สนุกกับการ coding