Codename One อัปเดตครั้งใหญ่ เร่งความเร็ว Maps
ทีมพัฒนา Codename One ปรับปรุงโครงสร้าง Maps และเพิ่มการใช้ Tagged Values บน ParparVM ลดเวลาค้นหาคีย์ที่หายไปจาก 32.7 วินาทีเหลือ 44.9 มิลลิวินาที

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- ลดเวลาค้นหาคีย์ที่ขาดหายไปใน Maps จาก 32.7 วินาที เหลือเพียง 44.9 มิลลิวินาที
- ขยายระบบ Tagged Values ให้รองรับ Short, Character, Float, Long และ Double
- ลดการจัดสรรออบเจกต์กล่อง (Boxed allocations) ในงาน JSON-like จาก 24.02 เหลือ 5.24 ต่อแมป
การปรับปรุงประสิทธิภาพครั้งล่าสุดของ Codename One ซึ่งเป็นเฟรมเวิร์กโอเพนซอร์สสำหรับการสร้างแอปพลิเคชันแบบเนทีฟบน iOS, Android, เดสก์ท็อป และเว็บ จากโค้ดเบสภาษา Java หรือ Kotlin เดียว ได้มุ่งเป้าไปที่การทำงานของ Maps และการจัดการหน่วยความจำบน ParparVM โดยได้รับแรงบันดาลใจมาจากแนวคิด Swiss tables
ก่อนหน้านี้ ทีมพัฒนาพบปัญหาคอขวดเมื่อทำการทดสอบการค้นหาคีย์ที่ไม่มีอยู่จริง โดยการเรียกใช้งาน containsKey จำนวน 3 ล้านครั้งใช้เวลามากถึง 32.7 วินาที ในขณะที่การค้นหาคีย์ที่มีอยู่จริงยังคงทำความเร็วได้ดีตามปกติ การสืบสวนชี้ให้เห็นว่าการค้นหาคีย์ที่ขาดหายไปทำให้เกิดการเดินค้นหา (linear probing) ผ่านรายการนับพันรายการเนื่องจากฮาสที่มีการกระจายตัวไม่ดีพอ

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ทีมงานได้แก้ไขปัญหานี้โดยการปรับเปลี่ยนกระบวนการสืบค้น (probe sequence) และนำรูปแบบการสืบค้นแบบ CPython มาปรับใช้ พร้อมทั้งปรับปรุงการเปรียบเทียบสตริงด้วยการแคชฮาสที่ไม่เท่ากัน และใช้ memcmp สำหรับอาร์เรย์ UTF-16 ที่เข้ากันได้ เพื่อให้ระบบการเปรียบเทียบเวกเตอร์แบบเนทีฟทำงานได้อย่างมีประสิทธิภาพ ผลลัพธ์ที่ได้ทำให้ภาระงานที่เน้นการค้นหาคีย์ที่หายไปลดลงอย่างมหาศาลจาก 32.7 วินาที เหลือเพียง 44.9 มิลลิวินาที
นอกจากการปรับปรุงเรื่อง Maps แล้ว ทีมงานยังได้ขยายขีดความสามารถของ Tagged Values บน ParparVM จากเดิมที่รองรับเฉพาะ Integer.valueOf พูลเควสท์ PR #5735 ได้ขยายให้ครอบคลุมถึง Short, Character, Float, Long และ Double โดยใช้ประโยชน์จาก 3 บิตต่ำสุดในแอดเดรสออบเจกต์แบบ 64-bit ที่ระบบสแกนราก (root scan) ของ ParparVM มองข้าม มาใช้เป็นแท็กบอกประเภทข้อมูล
การใช้ Tagged Values ในลักษณะนี้ช่วยให้ค่าข้อมูลขนาดเล็กสามารถเก็บไว้โดยตรงในหน่วยความจำขนาดเท่าคำสั่งอ้างอิง (reference-sized word) แทนที่จะต้องสร้างออบเจกต์ห่อหุ้ม (wrapper object) แยกต่างหาก ส่งผลให้การทำงานของตัวเก็บกวาดขยะ (Garbage Collector) มีประสิทธิภาพสูงขึ้นอย่างเห็นได้ชัดในชุดข้อมูล JSON
"An allocation census checks the mechanism independently of elapsed time. The JSON-like workload fell from 24.02 boxed allocations per map to 5.24."
Dev.to
ผลจากการปรับปรุงการจัดสรรหน่วยความจำนี้ ทำให้การทดสอบภาระงานจำลองแบบ JSON ลดจำนวนการจัดสรรออบเจกต์แบบกล่องจาก 24.02 เหลือเพียง 5.24 ครั้งต่อแมป ซึ่งตัวเลขดังกล่าวสอดคล้องกับปริมาณข้อมูลที่เข้ารหัสผ่าน Tagged Values อย่างแม่นยำ
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น