มีการบอกว่าสามารถลดเวลาโหลดของ GTA Online จาก 6 นาทีเหลือราว 1 นาที 50 วินาทีได้ ด้วยการแก้ฟังก์ชันง่าย ๆ เพียง 2 จุดที่เป็นคอขวด

นี่ไม่ใช่แพตช์ทางการ แต่เป็นผลการทดลองที่ผู้เขียนแก้เฉพาะ 2 ฟังก์ชันที่มีปัญหาด้วยการทำ dll hooking ดูแล้วออกมาแบบนี้เอง พอคิดว่าบริษัท Rockstar Games ซึ่งทำรายได้จาก GTA Online เพียงอย่างเดียวไปแล้วมากกว่า 1 ล้านล้านวอน นับตั้งแต่เปิดตัวช่วงปลายปี 2013 จนถึงตอนนี้ กลับยังไม่ได้แก้ปัญหาง่าย ๆ นี้ ก็รู้สึกว่าเกินไปหน่อยเหมือนกัน

ด้านล่างนี้คือสรุปสั้น ๆ ของจุดคอขวดเหล่านั้น ต้นฉบับเขียนไว้สนุกและละเอียดมาก ทั้งการวัดประสิทธิภาพ การหาต้นตอปัญหา และวิธีแก้ไข (พร้อมโค้ด) แนะนำให้อ่านกันครับ

  1. Json parsing with sscanf
  • โค้ดของเกมทำการพาร์สไฟล์ json แค็ตตาล็อกไอเท็มขนาดใหญ่ถึง 10MB และเรียกใช้ฟังก์ชัน sscanf กับแต่ละรายการ (มากถึงประมาณ 63,000 รายการ)

ฟังก์ชัน strlen ที่ sscanf เรียกใช้นั้น ต้องอ่านทีละตัวอักษรไปจนถึงท้ายไฟล์เพื่อหาความยาวของสตริง

  • มันจึงเสียเวลาเพิ่มอีก 1 นาที 30 วินาทีไปกับการอ่านสตริงขนาด 10MB ซ้ำต่อเนื่องถึง 63,000 ครั้ง
  1. Hash key not used
  • ต่อเนื่องจากข้อด้านบน ตอนนำข้อมูลไอเท็มที่พาร์สแล้วใส่ลงอาร์เรย์ โค้ดกลับค้นหาตำแหน่งสำหรับแทรกค่าด้วยการไล่เช็กแบบลำดับทีละตัวตั้งแต่ "ตำแหน่งเริ่มต้นของอาร์เรย์"

  • แม้จะใช้ค่าแฮชเพื่อตรวจว่าข้อมูลที่จะเก็บซ้ำหรือไม่ แต่กลับไม่ได้ใช้แฮชแมป ทำให้เสียเวลาเพิ่มอีกราว 1 นาที 40 วินาทีไปกับการตรวจสอบเพื่อหาตำแหน่งแทรกถึง ((63000^2+63000)/2) ครั้ง

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น