Özet - Zero-cost abstraction
- Rust kursu
- Uzman
- Ders 18/46
- 5 dk
Monomorphization, fusion ve inline'ı birleştirerek bir performans karşılaştırması yazarsın.
Sıfır maliyet özeti
Yineleyiciler, closure'lar ve generic'ler release derlemede elle yazılmış koda dönüşür. Monomorfizasyon hızlıdır ama kod şişirir; iç fonksiyon deseni ya da dyn bunu azaltır. Bağdaştırıcı zincirleri tek bir döngüye kaynaşır; ortadaki gereksiz collect bunu bozar. #[inline], #[cold] ipuçlarıdır. Sınır denetimleri yineleyici, zip ve öne alınmış assert ile kalkar. Her iddia ölçülmeli: criterion, godbolt, profil.
İki çağrı biçimi
Aynı closure iki yolla verilebilir:
fn uygula_generic<F: Fn(i32) -> i32>(f: F, n: i32) -> i32 {
f(n) // F her closure için ayrı derlenir, satır içi alınır
}
fn uygula_dyn(f: &dyn Fn(i32) -> i32, n: i32) -> i32 {
f(n) // tek kopya, vtable üzerinden çağrı
}Uygulama İki çağrı
Yukarıdaki uygula_generic ve uygula_dyn fonksiyonlarını yaz. |x| x + 1 closure'ını 41 ile ikisine de ver ve sonuçları boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn uygula_generic<F: Fn(i32) -> i32>(f: F, n: i32) -> i32 {
f(n)
}
fn uygula_dyn(f: &dyn Fn(i32) -> i32, n: i32) -> i32 {
f(n)
}
fn main() {
let artir = |x| x + 1;
println!("{} {}", uygula_generic(artir, 41), uygula_dyn(&artir, 41));
}Beklenen çıktı
42 42
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Generic closure parametresi ile <code>&dyn Fn</code> arasındaki temel fark nedir?
- Fark yok
- dyn daha hızlıdır
- Generic heap ayırır
- Generic satır içi alınır; dyn bir vtable çağrısıdır ama tek kopya derlenir Doğru cevap
Açıklama: Sıcak döngüde generic, nadir çağrılan geri çağırmalarda dyn genellikle iyi bir seçimdir.
2 Dinamik closure
fn uygula_dyn(f: &____ Fn(i32) -> i32, n: i32) -> i32 {
f(n)
}
fn uygula_dyn(f: &dyn Fn(i32) -> i32, n: i32) -> i32 {
f(n)
}
Açıklama: &dyn Fn tek bir derlenmiş kopya ile çalışır.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
Yineleyici |
Döngüyle aynı kod |
Monomorfizasyon |
Kod şişmesi |
#[cold] |
Nadir yol |
zip |
Denetimsiz eşleme |