CodeBlanks Logo Icon CodeBlanks

Özet - Derleme araçları

build.rs, LTO ve flamegraph'ı birleştirerek bir derleme raporu yazarsın.

Derleme araçları özeti

build.rs derleme öncesi kod üretir ve bağlayıcıya talimat verir; çıktılar OUT_DIR'a gider. Çapraz derleme hedef üçlüsü, rustup target ve uygun bağlayıcıyla yapılır. Release profilinde lto, codegen-units, panic, opt-level hız/boyut/derleme süresi arasında denge kurar. Optimizasyon profille başlar: perf/samply, flamegraph, criterion. Unsafe kod // SAFETY: yorumları, assert!'lerle korunan sözleşmeler ve Miri ile sağlam tutulur.

Küçük bir ölçüm yardımcısı

Ölçüm kodu genellikle bir işi n kez çağırır ve süreyi bölerek ortalamayı bulur. Çağrı sayısını sayan bir yardımcı, düzeneğin doğru çalıştığını da doğrular:

fn olc<F: FnMut()>(n: u32, mut f: F) -> std::time::Duration {
    let bas = std::time::Instant::now();
    for _ in 0..n {
        f();
    }
    bas.elapsed() / n
}

Süre her çalıştırmada değişir; bu yüzden benchmark araçları ısınma turları ve istatistiksel özet kullanır.

Uygulama Ölçüm düzeneği

Bir closure'ı n kez çağıran ve çağrı sayısını döndüren fn olc<F: FnMut()>(n: u32, mut f: F) -> u32 yaz. Bir sayacı artıran closure ile 1000 kez çağır ve 1000 çağrı, sayaç 1000 biçiminde yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn olc<F: FnMut()>(n: u32, mut f: F) -> u32 {
    for _ in 0..n {
        f();
    }
    n
}

fn main() {
    let mut sayac = 0;
    let n = olc(1000, || sayac += 1);
    println!("{} çağrı, sayaç {}", n, sayac);
}

Beklenen çıktı

1000 çağrı, sayaç 1000

Soru ve cevaplar

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

1 Basit bir ölçüm döngüsünde derleyicinin işi silmesini nasıl önlersin?

  • Önlenemez
  • Sonucu kullanmak ya da black_box'tan geçirmek Doğru cevap
  • Debug derlemek
  • Döngüyü uzatmak

Açıklama: Sonucu hiç kullanılmayan saf bir hesap, optimizasyonla tamamen kaldırılabilir.

2 Geçen süre

Soru
let bas = std::time::Instant::now();
is();
let sure = bas.____();
Cevap
let bas = std::time::Instant::now();
is();
let sure = bas.elapsed();

Açıklama: Instant::elapsed başlangıçtan bu yana geçen süreyi verir.

3 Grubun özeti

Kavram Anlamı
build.rs Derleme öncesi
--target Çapraz derleme
lto Bağlama anı optimizasyonu
Miri UB denetimi

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