ตอนนี้ฉันได้ค้นคว้าเรื่องนี้เล็กน้อยในบริบทของโครงการของตัวเองและตัดสินใจว่านี่คุ้มค่ากับคำตอบที่สมบูรณ์มากกว่าแค่ความคิดเห็น คำตอบนี้อิงตาม toolchain ของ Apple บน macOS (ซึ่งใช้เสียงดังกราวแทนที่จะเป็น gcc) แต่ฉันคิดว่าสิ่งต่าง ๆ ทำงานในลักษณะเดียวกันสำหรับทั้งคู่
กุญแจสำคัญในการดำเนินการนี้คือการเปิดใช้งาน 'การเพิ่มประสิทธิภาพเวลาลิงก์' เมื่อสร้างไลบรารีและไฟล์ปฏิบัติการของคุณ จริงๆ แล้วกลไกของสิ่งนี้ง่ายมาก - เพียงส่ง -flto
ไปยัง gcc และ ld บนบรรทัดคำสั่ง สิ่งนี้มีสองเอฟเฟกต์:
- รหัส (ฟังก์ชัน / วิธีการ) ในไฟล์อ็อบเจ็กต์หรือไฟล์เก็บถาวรที่ไม่เคยถูกเรียกจะถูกละเว้นจากไฟล์ปฏิบัติการขั้นสุดท้าย
- ตัวเชื่อมโยงดำเนินการเพิ่มประสิทธิภาพที่คอมไพลเลอร์สามารถทำได้ (เช่น ฟังก์ชันอินไลน์) แต่มีความรู้ที่ขยายข้ามขอบเขตของหน่วยการคอมไพล์
มันจะไม่ช่วยคุณหากคุณกำลังเชื่อมโยงกับไลบรารีที่ใช้ร่วมกัน แต่อาจช่วยได้หากไลบรารีที่ใช้ร่วมกันนั้นเชื่อมโยงกับไลบรารี (คงที่) อื่น ๆ ซึ่งมีโค้ดที่ไลบรารีที่ใช้ร่วมกันไม่เคยเรียกใช้
ในทางกลับกัน สิ่งนี้ทำให้ขนาดไฟล์ปฏิบัติการสุดท้ายของฉันลดลงประมาณ 5% ซึ่งฉันพอใจ YMMV.
ข้อเสียคือไฟล์อ็อบเจ็กต์ของฉันมีขนาดเพิ่มขึ้นประมาณสองเท่า และเวลาในการลิงก์ บางครั้ง เพิ่มขึ้นอย่างมาก (ประมาณ 100 เท่า) แล้วถ้าฉันเชื่อมโยงใหม่ มันก็เร็วขึ้นมาก อย่างไรก็ตาม พฤติกรรมนี้อาจเป็นลักษณะเฉพาะของ Toolchain ของ Apple บางทีมันอาจจะเป็นการซ่อนตัวกลางบิวด์บางส่วนไว้ที่ลิงค์แรก ไม่ว่าในกรณีใด หากคุณเปิดใช้งานตัวเลือกนี้สำหรับรุ่นที่วางจำหน่ายเท่านั้น ก็ไม่ควรเป็นปัญหาสำคัญ
มีรายละเอียดเพิ่มเติมเกี่ยวกับชุดตัวเลือกบรรทัดคำสั่ง gcc ทั้งหมดที่ควบคุมการเพิ่มประสิทธิภาพได้ที่นี่: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html ค้นหาหน้านั้นด้วย flto
เพื่อจำกัดการค้นหาของคุณให้แคบลง
และดูเบื้องหลังได้ที่ https://gcc.gnu.org/onlinedocs/gccint/LTO-Overview.html
แก้ไข:
ข้อมูลเพิ่มเติมเล็กน้อยเกี่ยวกับเวลาลิงก์ ตัวเชื่อมโยงของ Apple จะสร้างไฟล์ขนาดใหญ่บางไฟล์ในไดเรกทอรีชื่อ LTOCache เมื่อคุณเชื่อมโยง วันนี้ฉันไม่เห็นสิ่งเหล่านี้มาก่อน ดังนั้นสิ่งเหล่านี้จึงดูเหมือนเป็นตัวกลางในการสร้างที่เร่งการเชื่อมโยงเป็นครั้งที่สอง สำหรับลิงก์เริ่มต้นของฉันที่ช้ามาก ส่วนหนึ่งอาจเป็นเพราะในกรณีของฉัน ลิงก์เหล่านี้ถูกสร้างขึ้นบนเซิร์ฟเวอร์ SMB แต่อีกครั้ง CPU เต็มจนเต็มแล้วอาจจะไม่ได้
person
Paul Sanders
schedule
24.05.2018