วิธีการทำงานของการเพิ่มประสิทธิภาพตามโปรไฟล์ (PGO)

การเพิ่มประสิทธิภาพตามโปรไฟล์ (หรือที่เรียกว่า PGO หรือ "pogo") เป็นวิธีเพิ่มประสิทธิภาพบิลด์ที่เพิ่มประสิทธิภาพแล้วของเกมโดยใช้ข้อมูลเกี่ยวกับลักษณะการทำงานของเกมเมื่อเล่นในโลกจริง ด้วยวิธีนี้ โค้ดที่ทำงานไม่บ่อยนัก เช่น ข้อผิดพลาดหรือกรณีขอบ จะไม่เน้นในเส้นทางการดำเนินการที่สำคัญของโค้ด ซึ่งจะช่วยเพิ่มความเร็วได้

แผนภาพที่แสดงภาพรวมของวิธีการทำงานของ PGO

รูปที่ 1 ภาพรวมวิธีการทำงานของ PGO

หากต้องการใช้ PGO คุณต้องปรับแต่งบิลด์ก่อนเพื่อสร้างข้อมูลโปรไฟล์ที่คอมไพเลอร์ใช้ได้ จากนั้นคุณจะเรียกใช้โค้ดโดยการเรียกใช้บิลด์นั้นและ สร้างไฟล์ข้อมูลโปรไฟล์อย่างน้อย 1 ไฟล์ สุดท้าย ให้คัดลอกไฟล์เหล่านั้นกลับจากอุปกรณ์และใช้กับคอมไพเลอร์เพื่อเพิ่มประสิทธิภาพไฟล์ที่เรียกใช้งานได้โดยใช้ข้อมูลโปรไฟล์ที่คุณบันทึกไว้

วิธีการทำงานของการเพิ่มประสิทธิภาพบิลด์โดยไม่มี PGO

บิลด์ที่ได้รับการเพิ่มประสิทธิภาพโดยไม่ใช้ข้อมูลโปรไฟล์จะใช้ฮิวริสติกจำนวนหนึ่ง เมื่อตัดสินใจว่าจะสร้างโค้ดที่เพิ่มประสิทธิภาพอย่างไร

นักพัฒนาซอฟต์แวร์จะส่งสัญญาณบางอย่างอย่างชัดเจน เช่น ใน C++ 20 ขึ้นไป โดยใช้คำแนะนำเกี่ยวกับทิศทางของกิ่งก้าน เช่น [[likely]] และ [[unlikely]] อีกตัวอย่างหนึ่ง คือการใช้คีย์เวิร์ด inline หรือแม้แต่ __forceinline (แม้ว่าโดยทั่วไปแล้ว การใช้คีย์เวิร์ดแรกจะดีกว่าและยืดหยุ่นกว่า) โดยค่าเริ่มต้น คอมไพเลอร์บางตัวจะถือว่าขาแรกของกิ่ง (นั่นคือคำสั่ง if ไม่ใช่ส่วน else) เป็นกิ่งที่มีแนวโน้มมากที่สุด นอกจากนี้ ตัวเพิ่มประสิทธิภาพอาจ ยังทำการคาดการณ์จากการวิเคราะห์โค้ดแบบคงที่เกี่ยวกับวิธีที่โค้ดจะ ดำเนินการด้วย แต่โดยปกติแล้วการคาดการณ์นี้จะมีขอบเขตจำกัด

ปัญหาของฮิวริสติกเหล่านี้คือไม่สามารถช่วยคอมไพเลอร์ได้อย่างถูกต้องในทุกสถานการณ์ แม้จะมีการมาร์กอัปด้วยตนเองอย่างละเอียดก็ตาม ดังนั้นแม้ว่าโค้ดที่สร้างขึ้นจะได้รับการเพิ่มประสิทธิภาพอย่างดีโดยทั่วไป แต่ก็ยังไม่ดีเท่าที่ควรจะเป็นหากคอมไพเลอร์มีข้อมูลเพิ่มเติมเกี่ยวกับลักษณะการทำงานของโค้ดในรันไทม์

การสร้างโปรไฟล์

เมื่อสร้างไฟล์ที่เรียกใช้งานได้โดยเปิดใช้ PGO ในโหมดเครื่องมือ ระบบจะเพิ่มโค้ดที่จุดเริ่มต้นของทุกบล็อกโค้ดลงในไฟล์ที่เรียกใช้งานได้ เช่น จุดเริ่มต้นของฟังก์ชัน หรือจุดเริ่มต้นของแต่ละอาร์มของกิ่งก้าน โค้ดนี้ใช้เพื่อติดตามจำนวนครั้งที่บล็อกถูกป้อนโดย การเรียกใช้โค้ด ซึ่งคอมไพเลอร์จะใช้ในภายหลังเพื่อสร้างโค้ดที่เพิ่มประสิทธิภาพ

นอกจากนี้ยังมีการติดตามอื่นๆ ด้วย เช่น ขนาดของการคัดลอกทั่วไป ในบล็อก เพื่อให้สร้างการดำเนินการเวอร์ชันที่รวดเร็วและแบบอินไลน์ได้ในภายหลัง

หลังจากที่เกมดำเนินการบางอย่างที่เป็นตัวแทนแล้ว ไฟล์ปฏิบัติการต้องเรียกใช้ฟังก์ชัน __llvm_profile_write_file() เพื่อเขียนข้อมูลโปรไฟล์ไปยังตำแหน่งที่ปรับแต่งได้ในอุปกรณ์ ฟังก์ชันนี้จะ ลิงก์เข้ากับเกมโดยอัตโนมัติเมื่อการกำหนดค่าบิลด์เปิดใช้ การวัดผล PGO

จากนั้นควรคัดลอกไฟล์ข้อมูลโปรไฟล์ที่เขียนแล้วกลับไปยังคอมพิวเตอร์โฮสต์ และควรเก็บไว้ในตำแหน่งเดียวกับโปรไฟล์อื่นๆ จากบิลด์เดียวกัน เพื่อให้ใช้ร่วมกันได้

เช่น คุณสามารถแก้ไขโค้ดเกมเพื่อเรียกใช้ __llvm_profile_write_file() เมื่อฉากเกมปัจจุบันสิ้นสุดลง จากนั้นหากต้องการสร้างโปรไฟล์ คุณจะต้องสร้าง เกมโดยเปิดใช้การตรวจสอบ แล้วจึงนำไปใช้งานในอุปกรณ์ Android ขณะที่การทดสอบกำลังทำงาน ระบบจะบันทึกข้อมูลโปรไฟล์โดยอัตโนมัติ โดยวิศวกร QA จะเล่นเกมและทดสอบสถานการณ์ต่างๆ (หรือเพียงแค่ทำการทดสอบตามปกติ)

เมื่อฝึกซ้อมส่วนต่างๆ ของเกมเสร็จแล้ว คุณจะกลับไปที่ เมนูหลักได้ ซึ่งจะปิดฉากเกมปัจจุบันและเขียนข้อมูลโปรไฟล์

จากนั้นจะใช้สคริปต์เพื่อคัดลอกข้อมูลโปรไฟล์ออกจากอุปกรณ์ทดสอบ และ อัปโหลดไปยังที่เก็บข้อมูลส่วนกลางซึ่งสามารถบันทึกไว้ใช้ในภายหลังได้

การผสานข้อมูลโปรไฟล์

เมื่อได้รับโปรไฟล์จากอุปกรณ์แล้ว คุณจะต้องแปลงโปรไฟล์จาก ไฟล์ข้อมูลโปรไฟล์ที่สร้างโดยบิลด์ที่ใช้เครื่องมือ เป็นรูปแบบที่คอมไพเลอร์ใช้ได้ AGDE จะดำเนินการนี้ให้คุณโดยอัตโนมัติ สำหรับไฟล์ข้อมูลโปรไฟล์ที่คุณเพิ่มลงในโปรเจ็กต์

PGO ออกแบบมาเพื่อรวมผลลัพธ์ของการเรียกใช้โปรไฟล์ที่วัดผลหลายครั้ง เข้าด้วยกัน AGDE ก็ทําเช่นนี้ให้คุณโดยอัตโนมัติเช่นกันหากคุณ มีหลายไฟล์ในโปรเจ็กต์เดียว

ตัวอย่างการใช้ประโยชน์จากการผสานชุดข้อมูลโปรไฟล์สมมติว่าคุณ มีห้องทดลองที่เต็มไปด้วยวิศวกร QA ที่เล่นเกมของคุณในระดับต่างๆ ระบบจะบันทึกการเล่นแต่ละครั้ง แล้วนำไปใช้สร้างข้อมูลโปรไฟล์จากบิลด์ของเกมที่ติดตั้งเครื่องมือ PGO การผสานโปรไฟล์ช่วยให้คุณรวมผลลัพธ์จากการทดสอบที่แตกต่างกันทั้งหมดเหล่านี้ได้ ซึ่งอาจเรียกใช้โค้ดส่วนต่างๆ ที่แตกต่างกันอย่างมาก เพื่อให้ได้ผลลัพธ์ที่ดีขึ้น

ยิ่งไปกว่านั้น เมื่อทำการทดสอบตามยาว ซึ่งคุณเก็บสำเนา ข้อมูลโปรไฟล์จากการเผยแพร่ภายในสู่การเผยแพร่ภายใน การสร้างใหม่ไม่ จำเป็นต้องทำให้ข้อมูลโปรไฟล์เก่าไม่ถูกต้อง โดยส่วนใหญ่แล้ว โค้ดจะค่อนข้างเสถียรตั้งแต่รุ่นแรกจนถึงรุ่นล่าสุด ดังนั้นข้อมูลโปรไฟล์จากบิลด์เก่าจึงยังคงมีประโยชน์และไม่ล้าสมัยในทันที

การสร้างบิลด์ที่เพิ่มประสิทธิภาพตามการแนะนำโปรไฟล์

เมื่อเพิ่มข้อมูลโปรไฟล์ลงในโปรเจ็กต์แล้ว คุณจะใช้ข้อมูลดังกล่าวเพื่อ สร้างไฟล์ที่เรียกใช้งานได้โดยการเปิดใช้ PGO ในโหมดการเพิ่มประสิทธิภาพในการกำหนดค่าการสร้าง

ซึ่งจะสั่งให้เครื่องมือเพิ่มประสิทธิภาพของคอมไพเลอร์ใช้ข้อมูลโปรไฟล์ที่คุณบันทึกไว้ ก่อนหน้านี้เมื่อตัดสินใจเพิ่มประสิทธิภาพ

กรณีที่ควรใช้การเพิ่มประสิทธิภาพตามโปรไฟล์

PGO ไม่ได้มีไว้ให้คุณเปิดใช้ตั้งแต่เริ่มต้นการพัฒนา หรือระหว่างการทำซ้ำโค้ดในแต่ละวัน ในระหว่างการพัฒนา คุณควรเน้นการเพิ่มประสิทธิภาพตามอัลกอริทึมและเลย์เอาต์ข้อมูล เนื่องจากจะให้ประโยชน์แก่คุณมากกว่า

PGO จะมาในภายหลังในกระบวนการพัฒนา เมื่อคุณปรับแต่งเพื่อการเผยแพร่ การเพิ่มประสิทธิภาพตามโปรไฟล์เป็นเหมือนเชอร์รีที่อยู่บนยอดเค้ก ซึ่งช่วยให้คุณดึงประสิทธิภาพส่วนสุดท้ายออกจากโค้ดได้หลังจากที่ใช้เวลาเพิ่มประสิทธิภาพโค้ดด้วยตนเองไปแล้ว

การปรับปรุงประสิทธิภาพที่คาดไว้ด้วย PGO

ซึ่งขึ้นอยู่กับปัจจัยหลายอย่าง รวมถึงความครอบคลุมและความล้าสมัย ของโปรไฟล์ และความใกล้เคียงกับโค้ดที่เพิ่มประสิทธิภาพแบบดั้งเดิม

โดยทั่วไป การประมาณการแบบระมัดระวังมากคือค่าใช้จ่าย CPU จะลดลง ประมาณ 5% ในเธรดหลัก คุณอาจเห็นผลลัพธ์ที่แตกต่างกัน

เวลาที่ใช้ในการวัดคุม

การวัดประสิทธิภาพของ PGO นั้นครอบคลุม และแม้ว่าระบบจะสร้างขึ้นโดยอัตโนมัติ แต่ก็ไม่ได้ฟรี ค่าใช้จ่ายในการตรวจสอบ PGO อาจแตกต่างกันไปตามโค้ดเบส

ค่าใช้จ่ายด้านประสิทธิภาพของการวัดคุมที่แนะนำโดยโปรไฟล์

คุณอาจเห็นอัตราเฟรมลดลงเมื่อใช้บิลด์ที่มีการวัดประสิทธิภาพ ในบางกรณี ขึ้นอยู่กับว่า CPU ของคุณทำงานใกล้เคียง 100% มากน้อยเพียงใดในระหว่างการทำงานปกติ การลดลงนี้อาจมากจนทำให้การเล่นเกมตามปกติเป็นเรื่องยาก

เราขอแนะนำให้นักพัฒนาแอปส่วนใหญ่สร้างโหมดการเล่นซ้ำแบบกึ่งดีเทอร์มินิสติกสำหรับเกมของตน ฟังก์ชันการทำงานประเภทนี้ช่วยให้ทีม QA สามารถ เริ่มเกมในตำแหน่งเริ่มต้นที่ทราบและทำซ้ำได้ในเกม (เช่น เกมที่บันทึกไว้หรือระดับการทดสอบที่เฉพาะเจาะจง) แล้วบันทึกอินพุต อินพุตนี้ ที่บันทึกจากบิลด์ทดสอบสามารถป้อนลงในบิลด์ที่ใช้ PGO, เล่น ซ้ำ และสร้างข้อมูลโปรไฟล์ในโลกจริงได้ ไม่ว่าการประมวลผลแต่ละเฟรมจะใช้เวลานานเท่าใด ก็ตาม แม้ว่าเกมจะทำงานช้าจน เล่นไม่ได้ก็ตาม

ฟังก์ชันการทำงานประเภทนี้ยังมีประโยชน์อื่นๆ ที่สำคัญอีกด้วย เช่น การเพิ่มความพยายามของเครื่องมือทดสอบ โดยเครื่องมือทดสอบ 1 ตัวสามารถบันทึกอินพุตในอุปกรณ์ แล้วเล่นซ้ำในอุปกรณ์ประเภทต่างๆ หลายเครื่องเพื่อวัตถุประสงค์ในการทดสอบเบื้องต้น

ระบบการเล่นซ้ำเช่นนี้มีประโยชน์อย่างมากใน Android ซึ่งมีอุปกรณ์หลากหลายรูปแบบจำนวนมากในระบบนิเวศ และประโยชน์ไม่ได้หยุดอยู่แค่นั้น เพราะระบบนี้ยังเป็นส่วนสำคัญของระบบการผสานรวมอย่างต่อเนื่องได้ด้วย ซึ่งจะช่วยให้คุณทำการทดสอบการถดถอยของประสิทธิภาพและการทดสอบเบื้องต้นเป็นประจำได้ตลอด 24 ชั่วโมง

การบันทึกควรบันทึกข้อมูลที่ผู้ใช้ป้อนในจุดที่เหมาะสมที่สุดภายในกลไกการป้อนข้อมูลของเกม (ไม่น่าจะเป็นเหตุการณ์บนหน้าจอสัมผัสโดยตรง แต่เป็นการบันทึกผลลัพธ์เป็นคำสั่งแทน) อินพุตเหล่านี้ควรมี จำนวนเฟรมที่เพิ่มขึ้นอย่างต่อเนื่องในระหว่างการเล่นเกม เพื่อให้ในระหว่าง การเล่นซ้ำ กลไกการเล่นซ้ำสามารถรอเฟรมที่เหมาะสมซึ่งควร ทริกเกอร์เหตุการณ์ได้

ในโหมดการเล่นซ้ำ เกมควรหลีกเลี่ยงการลงชื่อเข้าใช้ออนไลน์ ไม่ควรแสดงโฆษณา และ ควรทำงานที่ไทม์สเต็ปคงที่ (ที่อัตราเฟรมเป้าหมาย) คุณควร พิจารณาปิดใช้ Vsync

ไม่จำเป็นที่ทุกอย่าง (เช่น ระบบอนุภาค) ในเกมของคุณ จะต้องทำซ้ำได้อย่างสมบูรณ์แบบ แต่การกระทำเดียวกันควรให้ผลลัพธ์และผลที่ตามมาในเกมเหมือนกัน นั่นคือ รูปแบบการเล่นควรเหมือนกัน

ค่าใช้จ่ายด้านหน่วยความจำของการวัดประสิทธิภาพที่แนะนำโดยโปรไฟล์

ค่าใช้จ่ายด้านหน่วยความจำของการวัด PGO จะแตกต่างกันมากตาม ไลบรารีที่เฉพาะเจาะจงที่คอมไพล์ ในการทดสอบ เราพบว่าขนาดของไฟล์ที่เรียกใช้งานได้สำหรับการทดสอบโดยรวมเพิ่มขึ้นประมาณ 2.2 เท่า การเพิ่มขนาดนี้รวมถึงโค้ดเพิ่มเติม ที่จำเป็นต่อการวัดบล็อกโค้ด และพื้นที่ที่จำเป็นต่อการจัดเก็บ ตัวนับ การทดสอบเหล่านี้ไม่ได้ครอบคลุมทุกกรณี และประสบการณ์การใช้งานของคุณอาจแตกต่างออกไป

ควรอัปเดตหรือทิ้งข้อมูลโปรไฟล์เมื่อใด

คุณควรอัปเดตโปรไฟล์ทุกครั้งที่ทำการเปลี่ยนแปลงโค้ด (หรือเนื้อหาเกม) ครั้งใหญ่

ความหมายที่แน่นอนของการดำเนินการนี้ขึ้นอยู่กับสภาพแวดล้อมในการสร้างและจุดที่คุณอยู่ในการพัฒนา

ดังที่กล่าวไว้ก่อนหน้านี้ คุณไม่ควรนำข้อมูลโปรไฟล์ไปใช้ในการเปลี่ยนแปลงสภาพแวดล้อมการสร้างที่สำคัญ เนื่องจากแม้ว่าการดำเนินการนี้จะไม่ทำให้คุณสร้างไม่ได้หรือทำให้การสร้างล้มเหลว แต่จะลดประโยชน์ด้านประสิทธิภาพของการใช้ PGO เนื่องจากข้อมูลโปรไฟล์เพียงเล็กน้อยเท่านั้นที่จะใช้ได้กับสภาพแวดล้อมการสร้างใหม่ อย่างไรก็ตาม กรณีนี้ ไม่ใช่กรณีเดียวที่ข้อมูลโปรไฟล์อาจล้าสมัย

มาเริ่มกันด้วยการสมมติว่าคุณจะไม่ใช้ PGO จนกว่าจะใกล้สิ้นสุดการพัฒนาเมื่อคุณเตรียมพร้อมสำหรับการเปิดตัว นอกเหนือจากการรวบรวมข้อมูลการจับภาพรายสัปดาห์เพื่อให้วิศวกรที่มุ่งเน้นประสิทธิภาพสามารถยืนยันได้ว่าจะไม่มีปัญหาที่ไม่คาดคิดเมื่อใกล้ถึงเวลาเปิดตัว

ซึ่งจะเปลี่ยนแปลงเมื่อคุณเข้าใกล้ช่วงเวลาที่เผยแพร่ เมื่อทีม QA ทดสอบทุกวัน และทดสอบเกมอย่างละเอียด ในระยะนี้ คุณจะ สร้างโปรไฟล์จากข้อมูลดังกล่าวได้ทุกวัน และใช้โปรไฟล์เหล่านั้นเพื่อเป็นข้อมูลในการสร้างในอนาคต สำหรับการทดสอบประสิทธิภาพและการปรับงบประมาณด้านประสิทธิภาพของคุณเอง

เมื่อเตรียมพร้อมสำหรับการเปิดตัว คุณควรล็อกเวอร์ชันบิลด์ที่วางแผนจะเปิดตัว จากนั้นให้ QA เรียกใช้เพื่อสร้างข้อมูลโปรไฟล์ใหม่ จากนั้นคุณจะสร้างโดยใช้ข้อมูลนี้เพื่อสร้างเวอร์ชันสุดท้ายของ ไฟล์ที่เรียกใช้งานได้

จากนั้นทีม QA จะทดสอบบิลด์ที่เพิ่มประสิทธิภาพนี้เป็นครั้งสุดท้ายเพื่อให้แน่ใจ ว่าพร้อมที่จะเผยแพร่