จากที่ไปฟังเรื่องการ optimize ระบบ Machine Learning จาก Arise Tech Meetup :: Go Together มานั้น
มีการ optimize ระบบที่พัฒนาด้วยภาษา Go ซึ่งที่พอจำได้ มีดังนี้

  • การจัดการเรื่อง context switching ของงานใน CPU ผ่าน go runtime
  • งานใช้ CPU เป็นหลัก จึงต้องแยก pool ตามงาน (task)
  • เปลี่ยนการจัดการ JSON จากที่ใช้ standard library มาใช้งาน Bytedance Sonic (Zero-copy และ SIMD)

โดยที่น่าสนใจและเข้าใจบ้าง คือตัวจัดการ JSON นั่นเอง (JSON Serializer)
เลยลองกลับมาทดสอบเล่นเองหน่อย

ได้ลองทดสอบกับ RESTful API ที่พัฒนาอยู่ใน Echo framework


ก็เลยทำการเปลี่ยนการ JSON Serializer ของ Echo ดูหน่อย
จากนั้นลอง benchmark ดูแบบง่าย ๆ หน่อยว่าเป็นอย่างไร

โดยทำการทดลอง 3 แบบ คือ

  • แบบที่ 1 ใช้ Standard ที่มีมากับ Echo framework
  • แบบที่ 2 ใช้งาน Sonic แบบ default เลย เห็นว่ามีแบบ fast ด้วย
  • แบบที่ 3 ใช้งาน Go JSON V2

ตัวอย่างของการ custom Serializer ขึ้นมาแบบง่าย ๆ

ตามเอกสารใน website นั่นเอง

ต่อมาก็ทำการเขียน test case เพื่อทำการ run benchmark ดูนิดหน่อย

เริ่มจากโครงสร้างของ JSON ก็ไม่สั้น หรือ ยาวเกินไป
เอาตามที่ใช้งานจริง ๆ

จากนั้นเขียนชุดการทดสอบทั้ง 3 แบบกัน

ผลการทดสอบบนเครื่อง Mac M2 และ Go 1.26.5 ได้ผลดังนี้

จากผลการทดสอบสรุปได้คร่าว ๆ ดังนี้

  • ทำงานเร็วสุดคือ Sonix ทำงาน 3991 ns/op รองลงมาคือ JSON V2
  • การ allocate memory พบว่า JSON V2 ใช้น้อยที่สุด คือ 7314 B/op และรองลงมาคือ Sonic (น่าสนใจมาก ๆ)
  • การ allocate ต่อ operation ก็เหมือนการ allocate memory คือ JSON V2 และ Sonic ตามลำดับ ซึ่งยิ่งน้อยจะลดการกดดันไปที่ GC มี latency ต่ำ และ throughput สูง ๆ ซึ่งดีต่อการ scale ของระบบเมื่อมีผู้ใช้งานเยอะ มาก ๆ

จะเห็นได้ว่า Sonic ออกแบบมาเพื่อการทำงานที่รวดเร็ว (CPU-bound task)
แต่ยังใช้ memory มากกว่า JSON V2

ทำการ generate เป็นรูปภาพด้วย Gemini Nano Banana นิดหน่อย

ลองใช้งานกันดูครับ
ผมเขียน code แบบง่าย ๆ น่าจะยังไม่ดีเท่าไร
ขอให้สนุกกับการ coding