CodeBlanks Logo Icon CodeBlanks

Abstraction maliyeti

Abstraction'ın maliyetini ölçmeyi öğrenirsin.

Soyutlama maliyeti

Rust'ın tasarım ilkesi, C++'tan devralınan sıfır maliyetli soyutlamadır: "Kullanmadığın şeyin bedelini ödemezsin; kullandığını da elle daha iyi yazamazsın." Yineleyiciler, closure'lar, generic'ler ve Option gibi soyutlamalar derlendikten sonra elle yazılmış döngüyle aynı makine koduna dönüşür:

// soyut
let a: u32 = (1..=10).filter(|n| n % 2 == 0).sum();

// elle
let mut b = 0;
let mut i = 1;
while i <= 10 {
    if i % 2 == 0 { b += i; }
    i += 1;
}

Release derlemede iki sürüm genellikle aynı ya da neredeyse aynı assembly üretir.

Ölçmek

İddiaları ölçerek doğrula. criterion crate'i istatistiksel benchmark yapar; assembly'yi görmek için Compiler Explorer (godbolt.org) ya da cargo asm kullanılır:

// benches/toplam.rs (criterion)
c.bench_function("yineleyici", |b| {
    b.iter(|| (1..=black_box(1000u32)).filter(|n| n % 2 == 0).sum::<u32>())
});

Sıfır maliyet her soyutlama için geçerli değildir: Box<dyn Trait>, Rc, RefCell ve Mutex bilinçli olarak seçilen, gerçek maliyeti olan araçlardır.

Uygulama İki yol, aynı sonuç

1'den 10'a kadar çift sayıların toplamını önce yineleyici zinciriyle, sonra while döngüsüyle hesapla. İki sonucu boşlukla yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn main() {
    let a: u32 = (1..=10).filter(|n| n % 2 == 0).sum();
    let mut b = 0;
    let mut i = 1;
    while i <= 10 {
        if i % 2 == 0 {
            b += i;
        }
        i += 1;
    }
    println!("{} {}", a, b);
}

Beklenen çıktı

30 30

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Sıfır maliyet iddiası hangi derleme için geçerlidir?

  • Optimizasyonlu (release) derleme Doğru cevap
  • Debug derleme
  • Her ikisi eşit
  • Hiçbiri

Açıklama: Debug derlemede satır içi alma yapılmaz; soyutlamalar gerçekten fonksiyon çağrısı olarak kalır ve yavaştır.

2 Soyut toplam

Soru
let a: u32 = (1..=10).____(|n| n % 2 == 0).sum();
Cevap
let a: u32 = (1..=10).filter(|n| n % 2 == 0).sum();

Açıklama: filter çift sayıları seçer; sum onları toplar.

3 Araç ve maliyeti

Kavram Anlamı
Yineleyici zinciri Sıfır maliyet
Generic fonksiyon Sıfır (kod çoğalır)
Box<dyn Trait> Dolaylı çağrı
RefCell Çalışma anı denetimi

Uzman bölümündeki tüm dersler