Linker
- Rust kursu
- Uzman
- Ders 39/46
- 4 dk
Linker seçimi ve LTO ayarlarını öğrenirsin.
Linker
Derleyici her crate'i ayrı nesne dosyalarına çevirir; bağlayıcı onları ve kütüphaneleri tek bir ikili dosyada birleştirir. Bağlama süresi büyük projelerde önemli hale gelir; daha hızlı bağlayıcılar (lld, mold) kullanılabilir. Release profilindeki ayarlar optimizasyonun kapsamını belirler:
[profile.release]
lto = "fat" # crate'ler arası satır içi alma ve ölü kod silme
codegen-units = 1 # tek birim: daha iyi optimizasyon, daha yavaş derleme
panic = "abort" # geri sarma tabloları yok: daha küçük ikili
strip = true # sembolleri sillto = "thin", tam LTO'nun kazancının çoğunu çok daha kısa sürede verir.
Ayarları ölçerek seç
Her ayar bir ödünleşimdir: hız, boyut ve derleme süresi. Boyut için opt-level = "z", hız için opt-level = 3; dağıtımdan önce farklı profiller denenip ölçülmelidir. Özel profiller tanımlanabilir:
[profile.dagitim]
inherits = "release"
lto = "fat"
codegen-units = 1
$ cargo build --profile dagitimProfil dosyası basit bir anahtar = değer biçimidir; araçlar onu okuyup öneri üretebilir.
Uygulama Profil oku
"lto = \"fat\"\ncodegen-units = 1\nopt-level = 3" metnini satır satır oku, her satırı split_once('=') ile böl, anahtar ve değerleri trim edip tırnaklardan arındırarak bir BTreeMap'e koy. Ayar sayısını ve lto değerini boşlukla yazdır.
Başlangıç kodu
use std::collections::BTreeMap;
fn main() {
// buraya yaz
}Örnek çözüm
use std::collections::BTreeMap;
fn main() {
let metin = "lto = \"fat\"\ncodegen-units = 1\nopt-level = 3";
let mut ayarlar = BTreeMap::new();
for s in metin.lines() {
if let Some((a, d)) = s.split_once('=') {
ayarlar.insert(a.trim().to_string(), d.trim().trim_matches('"').to_string());
}
}
println!("{} {}", ayarlar.len(), ayarlar["lto"]);
}Beklenen çıktı
3 fat
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 LTO (link-time optimization) neyi mümkün kılar?
- Farklı crate'lerdeki fonksiyonları birlikte optimize etmeyi (satır içi alma, ölü kod silme) Doğru cevap
- Daha hızlı derleme
- Hata ayıklamayı
- Çapraz derlemeyi
Açıklama: LTO olmadan her crate ayrı optimize edilir; bağımlılıklardaki küçük fonksiyonlar satır içine alınamayabilir.
2 Crate'ler arası optimizasyon
[profile.release]
____ = "fat"
[profile.release]
lto = "fat"
Açıklama: lto bağlama anı optimizasyonunu açar.
3 Ayar ve etkisi
| Kavram | Anlamı |
|---|---|
lto = "fat" |
Tam LTO |
codegen-units = 1 |
Tek optimizasyon birimi |
panic = "abort" |
Daha küçük ikili |
opt-level = "z" |
Boyut odaklı |