Rust ve C++ derleme sürelerini karşılaştırmak
(quick-lint-js.com)Başka bir yerde ilginç bir yazıya rastladım; burada da paylaşmak istedim.
Rust ve C++ birçok açıdan sık sık karşılaştırılıyor. Ancak derleme sürelerini doğrudan karşılaştırmak zordu; çünkü aynı projenin her iki dilde de yazılmış olması nadiren görülüyor. quick-lint-js, C++ ile yazılmış bir projedeki bazı bölümleri Rust ile yeniden yazarak derleme sürelerini karşılaştırmış. Ancak derleme ortamına Windows dahil edilmemiş.
Port etme kriterleri
- Üçüncü taraf kütüphaneler hariç
- Linux ve macOS üzerinde çalışma
- Kapsamlı bir test paketi
- FFI, işaretçiler, standart ve özel yazılmış konteynerler, yardımcı sınıflar ve işlevler, I/O, eşzamanlılık, generics, makrolar, SIMD, kalıtım, ...
Sonuç
- Rust'ın derleme süresi C++ ile benzer ya da daha yavaş (en azından bu projede)
- Rust'ta C++'a kıyasla daha fazla kod yazmak gerekiyor
- Tam (Full) derlemede C++ benzer hızda ya da daha hızlı
- Artımlı (Incremental) derlemede bazen daha kısa, bazen daha uzun sürüyor (çok uzun olduğu durumlar da var)
- quick-lint-js'in geri kalanını Rust'a port etmemeye karar vermişler (derleme süresinde iyileşme olsaydı belki yapılabilirdi?)
4 yorum
Burada da Rust kullanan epey kişi var gibi görünüyor. Herkesin hangi sektörde çalıştığını merak ediyorum.
İlk derlemeden sonra C++ tarafında çok sayıda bağımlılığı olan
hyerine tek bircppdosyasında değişiklik yapıldığında derleme çok hızlı oluyor; Rust'ta durumun nasıl olduğunu merak ediyorum.Rust belgelerinin sık sorulan sorular bölümünde bununla ilgili ayrıntılı bir açıklama vardı; paylaşayım dedim
====================================
Rust derlemesi yavaş gibi görünüyor. Bunun sebebi nedir?
Çünkü kodu makine diline çevirip optimize eder. Rust, verimli makine koduna derlenen yüksek seviyeli soyutlamalar sunar ve bu çeviri süreci, özellikle optimizasyon yapıldığında, doğal olarak zaman alır.
Bununla birlikte Rust'ın derleme süresi düşünüldüğü kadar kötü değildir ve gelecekte daha da iyileşeceğine inanmak için sebepler vardır. C++ ve Rust ile benzer büyüklükteki projeleri karşılaştırdığınızda, tüm projeyi derleme süresi genellikle birbirine yakındır. Rust derlemesinin yavaş hissedilmesinin başlıca nedeni, C++ ile Rust'ın derleme modellerinin farklı olmasıdır; yani C++'ta derleme birimi tek bir dosyayken Rust'ta birden çok dosyadan oluşan bir crate'tir. Bu nedenle geliştirme sırasında C++ dosyalarından birini değiştirdiğinizde, derleme süresi Rust'a kıyasla çok daha fazla kısalabilir. Şu anda Rust derleyicisini yeniden düzenleyerek artımlı derlemeyi mümkün kılmaya yönelik büyük bir çalışma sürüyor; bu tamamlandığında Rust'ta da C++ modelindekine benzer şekilde derleme süreleri iyileşecektir.
Derleme modelinden bağımsız olarak, Rust'ın dil tasarımında derleme süresini etkileyen çeşitli unsurlar vardır.
İlk olarak Rust, nispeten karmaşık bir tip sistemine sahiptir ve Rust'ı çalışma zamanında güvenli kılan kısıtlamaları zorunlu kılmak için küçümsenmeyecek miktarda derleme süresi harcanır.
İkinci olarak Rust derleyicisinde eski teknik borçlar vardır; özellikle üretilen LLVM IR'nin kalitesi yeterince iyi olmadığından, LLVM bunu “düzeltmek” için zaman harcamak zorunda kalır. Gelecekte MIR tabanlı optimizasyon ve çeviri aşamaları, Rust derleyicisinin LLVM üzerinde yarattığı yükü azaltabilir.
Üçüncü olarak, Rust'ın kod üretimi için LLVM kullanması iki ucu keskin bir kılıçtır. LLVM sayesinde Rust dünya çapında çalışma zamanı performansı sunar, ancak LLVM derleme süresine odaklanmayan devasa bir framework'tür ve özellikle düşük kaliteli girdilere karşı hassastır.
Son olarak, Rust'ın genelleştirilmiş (generic) tipleri C++'a benzer şekilde monomorphise etme stratejisi hızlı kod üretir, ancak diğer çeviri stratejilerine kıyasla çok daha fazla kod üretme gibi bir sorunu vardır. Bu kod şişmesi, trait object kullanılarak dinamik dispatch ile artı ve eksiler arasında bir denge kurularak azaltılabilir.
Kesin olan şu ki Rust projeleri build alırken diski gerçekten çok tüketiyor. Yüz kadar kütüphane kullanan bir projenin bir anda yaklaşık 2GB yer kapladığını görüp şaşırdığımı hatırlıyorum...