Bahasa pengaturcaraan Rust terus menghadapi kritikan mengenai masa kompilasi yang terkenal perlahan, walaupun terdapat penambahbaikan ketara yang dibuat oleh pasukan pembangunan dalam beberapa tahun kebelakangan ini. Analisis terperinci daripada kumpulan kerja prestasi pengkompil Rust mendedahkan cabaran kompleks di sebalik isu berterusan ini dan mengapa penyelesaian pantas masih sukar dicapai.
Peningkatan Prestasi Pengkompil Rust (2021-2024)
- Kelajuan pengkompilan keseluruhan: ~2x lebih pantas dalam tempoh 3 tahun
- Contoh pengurangan masa pembinaan projek: 1m 15s → 1m 9s
- Pemantauan prestasi: Suite penanda aras komprehensif dijalankan selepas setiap PR yang digabungkan
- Proses triaj regresi prestasi mingguan
Seni Bina Teknikal Mewujudkan Kesesakan Asas
Punca utama kelambatan kompilasi Rust berpunca daripada keputusan seni bina mendalam yang mengutamakan prestasi masa jalan berbanding kelajuan masa kompilasi. Reka bentuk bahasa yang berpaksikan abstraksi kos sifar bermakna pengkompil menjana kod perwakilan perantaraan (IR) yang meluas yang mesti dioptimumkan dengan berat oleh LLVM , infrastruktur pengkompil bahagian belakang. Pendekatan ini mewujudkan pertukaran asas di mana mencapai prestasi masa jalan yang pantas memerlukan pemprosesan masa kompilasi yang besar.
Komuniti telah mengenal pasti LLVM sebagai kesesakan utama, tetapi masalah ini melangkaui bahagian belakang sahaja. Sistem monomorfisasi Rust , yang mencipta versi khusus fungsi generik untuk setiap jenis yang digunakan, melipatgandakan jumlah kod yang memerlukan kompilasi. Selain itu, model kompilasi berasaskan crate, walaupun menyediakan modulariti yang cemerlang, boleh membawa kepada unit kompilasi yang lebih besar daripada yang biasanya dikendalikan oleh bahasa lain.
Kesesakan Teknikal yang Dikenal pasti
- Laluan pengoptimuman backend LLVM : Kesesakan utama bagi kebanyakan projek
- Monomorphization : Mencipta beberapa salinan fungsi generik
- Kompilasi kebergantungan: Mesti membina semula untuk setiap projek
- Kompilasi tambahan: Keberkesanan terhad dalam ruang kerja yang besar
- Fasa penyambungan: Bahagian ketara daripada jumlah masa pembinaan
Pertumbuhan Ekosistem Mengatasi Penambahbaikan Pengkompil
Walaupun pengkompil Rust hampir menggandakan prestasinya dalam tempoh tiga tahun yang lalu, pertumbuhan pesat ekosistem telah mengimbangi banyak keuntungan ini. Projek Rust moden biasanya merangkumi berpuluh atau beratus kebergantungan, setiap satu memerlukan kompilasi. Komuniti menyatakan bahawa perpustakaan terus menambah ciri dan kebergantungan lebih cepat daripada pengkompil dapat mengoptimumkannya.
Ini mewujudkan pengalaman yang mengecewakan di mana projek individu mungkin melihat masa binaan mereka meningkat walaupun menggunakan pengkompil yang lebih pantas. Ledakan kebergantungan terutamanya menjejaskan binaan kali pertama, di mana pembangun mesti mengkompil keseluruhan pokok kebergantungan dari awal. Sesetengah projek melaporkan masa binaan bersih selama 10+ minit untuk pangkalan kod yang agak sederhana apabila memasukkan semua kebergantungan.
Masa Pembinaan yang Dilaporkan oleh Komuniti
- Projek kecil Rust (beberapa ribu baris): 1-10 minit untuk pembinaan bersih
- Projek sederhana (40k baris + kebergantungan): 1-2 minit
- Perbandingan projek besar C++ : 30 minit pada perkakasan mewah
- Projek setara Go : 2-40 saat termasuk kebergantungan
Cabaran Organisasi Mengehadkan Penambahbaikan Utama
Projek Rust beroperasi sebagai usaha sumber terbuka yang dipacu sukarelawan, yang mewujudkan cabaran unik untuk menangani penambahbaikan prestasi berskala besar. Perubahan seni bina utama memerlukan penyelarasan merentas berbilang kumpulan kerja dan mengekalkan keserasian dengan pembangunan berterusan. Tidak seperti bahasa yang disokong korporat yang boleh mendedikasikan pasukan kepada masalah tertentu, Rust bergantung kepada penyumbang yang bekerja pada isu yang menarik minat mereka.
Keuntungan besar-besaran akan diperoleh kemudian dalam saluran paip, tetapi tiada satu pun daripada ini yang menjadikan pengkompil Rust perlahan. Anda tidak akan memperoleh keuntungan besar dengan mengubah ini.
Penambahbaikan yang paling menjanjikan memerlukan perubahan asas kepada seni bina dalaman pengkompil, berpotensi mengambil masa bertahun-tahun untuk dilaksanakan sambil mengekalkan pangkalan kod sedia ada. Usaha ini bersaing dengan kerja yang lebih bermanfaat serta-merta seperti menambah ciri bahasa baharu atau membetulkan pepijat.
Perbandingan Dengan Bahasa Lain Menonjolkan Pertukaran
Perdebatan kelajuan kompilasi sering berpusat pada perbandingan dengan Go , yang direka bentuk secara khusus untuk kompilasi pantas dari awal. Go mencapai masa binaan sub-saat untuk projek besar dengan membuat pilihan reka bentuk yang berbeza, termasuk sistem jenis yang lebih mudah dan mengelakkan pengoptimuman kompleks yang dilakukan oleh Rust . Walau bagaimanapun, ini datang dengan kos prestasi masa jalan dan jaminan keselamatan memori yang disediakan oleh Rust .
Pembangun C++ , secara ironinya, sering mengadu tentang masa kompilasi Rust walaupun bekerja dengan bahasa yang terkenal dengan binaan yang perlahan. Perbezaannya terletak pada strategi kompilasi tambahan - projek C++ boleh distrukturkan dengan pengurusan pengepala yang teliti dan unit kompilasi modular, manakala perkakas Rust semasa tidak menyediakan fleksibiliti yang setara.
Pasukan Rust terus bekerja pada penyelesaian termasuk bahagian belakang Cranelift untuk binaan nyahpepijat yang lebih pantas dan kompilasi tambahan yang diperbaiki. Walau bagaimanapun, penambahbaikan ini mewakili perubahan evolusi dan bukannya revolusi. Ketegangan asas antara prestasi masa kompilasi dan masa jalan kekal sebagai ciri yang menentukan bahasa ini, mencerminkan keputusan sedar untuk mengutamakan keselamatan dan kelajuan pelaksanaan berbanding kelajuan kompilasi.
Rujukan: Why doesn't Rust care more about compiler performance?