Saya sekarang telah meneliti ini sedikit dalam konteks proyek saya sendiri dan memutuskan bahwa ini layak mendapat jawaban lengkap daripada sekadar komentar. Jawaban ini didasarkan pada rantai alat Apple di macOS (yang menggunakan dentang, bukan gcc), tapi menurut saya semuanya bekerja dengan cara yang hampir sama untuk keduanya.
Kuncinya adalah mengaktifkan 'pengoptimalan waktu tautan' saat membangun perpustakaan dan file yang dapat dieksekusi. Mekanismenya sebenarnya sangat sederhana - cukup berikan -flto
ke gcc dan ld pada baris perintah. Ini memiliki dua efek:
- Kode (fungsi/metode) dalam file objek atau arsip yang tidak pernah dipanggil dihilangkan dari eksekusi akhir.
- Linker melakukan semacam optimasi yang dapat dilakukan oleh kompiler (seperti fungsi inlining), namun dengan pengetahuan yang melampaui batas-batas unit kompilasi.
Ini tidak akan membantu Anda jika Anda menautkan ke perpustakaan bersama, tetapi mungkin membantu jika perpustakaan bersama itu tertaut dengan perpustakaan (statis) lain yang berisi kode yang tidak pernah dipanggil oleh perpustakaan bersama.
Sisi positifnya, ini mengurangi ukuran eksekusi akhir saya sekitar 5%, dan ini membuat saya senang. YMMV.
Sisi negatifnya, ukuran file objek saya kira-kira dua kali lipat dan terkadang waktu tautan meningkat drastis (kira-kira sekitar 100 kali lipat). Lalu, jika saya tautkan kembali, jauh lebih cepat. Namun perilaku ini mungkin merupakan kekhasan rantai alat Apple. Mungkin ia menyembunyikan beberapa perantara bangunan di suatu tempat pada tautan pertama. Bagaimanapun, jika Anda hanya mengaktifkan opsi ini untuk versi rilis, hal ini tidak akan menjadi masalah besar.
Terdapat detail lebih lanjut mengenai rangkaian lengkap opsi baris perintah gcc yang mengontrol pengoptimalan di sini: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html. Telusuri laman itu untuk flto
untuk mempersempit penelusuran Anda.
Dan untuk melihat sekilas di balik layar, lihat: https://gcc.gnu.org/onlinedocs/gccint/LTO-Overview.html
Sunting:
Sedikit informasi lebih lanjut tentang waktu tautan. Tautan Apple membuat beberapa file besar di direktori bernama LTOCache saat Anda menautkan. Saya belum pernah melihat ini sebelumnya, jadi ini tampaknya merupakan perantara yang mempercepat tautan untuk kedua kalinya. Mengenai tautan awal saya yang sangat lambat, hal ini mungkin sebagian disebabkan oleh fakta bahwa, dalam kasus saya, tautan ini dibuat di server SMB. Tapi sekali lagi, CPU sudah maksimal jadi mungkin tidak.
person
Paul Sanders
schedule
24.05.2018