ข้ามไปเนื้อหาหลัก

Codename One อัปเดตครั้งใหญ่ เร่งความเร็ว Maps

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

เรียบเรียงโดย AI
Inewgen
21 Sep 2026ที่มา: Dev.to2 นาทีอ่าน (0 ครั้ง)
แชร์
Codename One อัปเดตครั้งใหญ่ เร่งความเร็ว Maps

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ขนาดตัวอักษร
  • ลดเวลาค้นหาคีย์ที่ขาดหายไปใน 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) ผ่านรายการนับพันรายการเนื่องจากฮาสที่มีการกระจายตัวไม่ดีพอ

software architecture diagram computer engineering

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ทีมงานได้แก้ไขปัญหานี้โดยการปรับเปลี่ยนกระบวนการสืบค้น (probe sequence) และนำรูปแบบการสืบค้นแบบ CPython มาปรับใช้ พร้อมทั้งปรับปรุงการเปรียบเทียบสตริงด้วยการแคชฮาสที่ไม่เท่ากัน และใช้ memcmp สำหรับอาร์เรย์ UTF-16 ที่เข้ากันได้ เพื่อให้ระบบการเปรียบเทียบเวกเตอร์แบบเนทีฟทำงานได้อย่างมีประสิทธิภาพ ผลลัพธ์ที่ได้ทำให้ภาระงานที่เน้นการค้นหาคีย์ที่หายไปลดลงอย่างมหาศาลจาก 32.7 วินาที เหลือเพียง 44.9 มิลลิวินาที

44.9 msเวลาค้นหาหลังปรับปรุง
5.24การจัดสรรออบเจกต์ต่อแมป

นอกจากการปรับปรุงเรื่อง 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

ความคิดเห็น

แสดงความคิดเห็น
0/2000

พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้