[Golang] Why you should use pointer receiver.
สวัสดีครับผู้อ่าน ถ้าผู้อ่านที่ได้เข้ามาอ่านในเรื่องนี้อาจจะต้องย้อนกลับไปอ่าน เรื่อง [Golang] How to benchmark and what is it ก่อนเพื่อความเข้าใจในการทำการเปรียบเทียบด้วยการทำ Benchmark เพราะในหัวข้อนี้จะมีการทำ Benchmark เพื่อเปรียบเทียบความเร็วของ pointer receiver กับ การใช้ receiver ปกติ
เปรียบเทียบด้วย Benchmark ให้เห็นจะๆ
เราจะทำการใช้ Code ง่ายๆ แบบ ง่ายแสนง่าย ดังรูป
จะเห็นว่าใน Code มีการทำฟังก์ชั่น Receiver ทั้ง 2 แบบ ทั้ง Value Receiver และ Pointer Receiver ซึ่งทั้งคู่ return 0 หรือใครจะเขียนอะไรอย่างอื่นเพิ่มก็ได้นะแล้วแต่ แต่ต้องเป็น Code ที่เหมือนกันเพื่อที่จะได้เปรียบเทียบอย่างเห็นได้ชัด
รูปที่ 2 นั้นแสดง Code benchmark ของทั้ง 2 ตัวซึ่งเราจะนำมา run ทดสอบที่ละตัวและนำผลลัพท์มาเทียบกัน
ทำการทดสอบ Value Receiver กันก่อนเลย ได้ผลลัพธ์ดังรูปที่ 3
จากรูปที่ 3 แสดงผลว่า ได้ทำ loop ไปทั้งหมด 2000000000 ครั้ง ที่ความเร็ว 0.56 Nanosecond per loop และใช้เวลาทั้งหมด 1.336 second
จากรูปที่ 4 แสดงผลว่า ได้ทำ loop ไปทั้งหมด 2000000000 ครั้ง ที่ความเร็ว 0.27 Nanosecond per loop และใช้เวลาทั้งหมด 0.730 second
แค่นี้ก็เห็นชัดแล้วครับ ว่า Value Receiver vs Pointer Receiver นั้น Pointer Receiver ชนะแบบกินขาดด้านความเร็วกันเลยทีเดียว
ควรจะเลือกใช้ยังไงระหว่างทั้ง 2 ตัวนี้
โดยพื้นฐานเลยคือ
1. อย่าเอา Value Receiver และ Pointer Receiver มาปะปนกัน
2. ถ้านึกอะไรไม่ออกหรือไม่รู้จะใช้อะไร ให้ใช้ Pointer Receiver ไปเลย
Pointer Receiver
เราจำเป็นที่จะต้องใช้ Pointer Receiver เมื่อ มีความต้องการที่จะเปลี่ยนแปลงค่า receiver และ หาก struct มีการใช้ sync.Mutex หรือ การทำ synchronizing ที่คล้ายกัน ก็ควรจะใช้ Pointer Receiver เช่นกัน
แต่มีความเป็นไปได้ที่จะเลือกใช้ Pointer Receiver เมื่อ struct ที่สร้าง หรือ array มีขนาดใหญ่มาก
Value receivers
มีความเป็นไปได้ที่จะเลือกใช้ Value receivers เมื่อ type เป็น map, func, chan, basic type เช่น int เป็นต้น และ array หรือ struct ขนาดเล็กที่เป็น value type
สรุป
โดยสรุปแล้วถ้าผู้อ่าน อ่านมาจนถึงตรงนี้ก็จะเห็นแล้วละครับ ว่า Pointer Receiver นั้น มีความเร็วที่เร็วกว่าแน่นอน เมื่อเปรียบเทียบกันในเ้านความเร็ว แต่อย่างไรก็ตาม เราก็ควรจะเลือกใช้ให้ถูกประเภท ไม่ว่าจะเป็น Pointer Receiver หรือ Value Receiver เพื่อที่จะทำให้ Code โดยรวมมีประสิทธิภาพ แล้วผู้อื่นสามารถเข้าใจได้ง่าย.