CodeBlanks Logo Icon CodeBlanks

Profiling

perf ve flamegraph ile profil çıkarmayı öğrenirsin.

Profiling

Optimizasyonun ilk kuralı: tahmin etme, ölç. Örnekleme profilleyicileri (Linux'ta perf, macOS'ta Instruments, her yerde samply) programı düzenli aralıklarla durdurup yığın izini kaydeder. Bu örnekler bir flamegraph'e dönüştürülür: genişlik, bir fonksiyonda geçen zamanın payıdır:

$ cargo install flamegraph
$ cargo flamegraph --release -- girdi.txt

# Cargo.toml: profilde sembol bilgisi
[profile.release]
debug = true

Flamegraph'te en geniş "plato"lar (üstünde başka çağrı olmayan geniş kutular) optimize edilecek ilk yerlerdir.

Katlanmış yığınlar

Flamegraph araçları örnekleri "katlanmış" biçimde işler: her satır noktalı virgülle ayrılmış bir çağrı zinciridir. Aynı yaprak fonksiyonun kaç örnekte göründüğünü saymak, zamanın nerede geçtiğini verir:

main;hesapla;topla
main;hesapla;topla
main;yaz

// yaprak sayımı: topla 2, yaz 1 → zamanın 2/3'ü topla'da

inferno crate'i bu biçimden SVG flamegraph üretir.

Uygulama Örnekleri say

["main;hesapla;topla", "main;hesapla;topla", "main;yaz"] örneklerinde yaprak fonksiyonları rsplit(';') ile bul ve bir BTreeMap'te say. Her birini ad sayı biçiminde ayrı satırlara yazdır.

Başlangıç kodu

main.rs
use std::collections::BTreeMap;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::collections::BTreeMap;

fn main() {
    let yiginlar = ["main;hesapla;topla", "main;hesapla;topla", "main;yaz"];
    let mut sayim: BTreeMap<&str, u32> = BTreeMap::new();
    for o in yiginlar {
        let yaprak = o.rsplit(';').next().unwrap();
        *sayim.entry(yaprak).or_insert(0) += 1;
    }
    for (ad, n) in &sayim {
        println!("{} {}", ad, n);
    }
}

Beklenen çıktı

topla 2
yaz 1

Soru ve cevaplar

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

1 Profili neden release derlemede almak gerekir?

  • Debug'da profil alınamaz
  • Gelenek
  • Gerekmez
  • Debug derlemede darboğazlar tamamen farklıdır; optimizasyonsuz soyutlamalar yanıltıcı sonuç verir Doğru cevap

Açıklama: debug = true ile release derlemeye sembol eklenir; optimizasyon korunur, fonksiyon adları görünür.

2 Yaprağı al

Soru
let yaprak = yigin.____(';').next().unwrap();
Cevap
let yaprak = yigin.rsplit(';').next().unwrap();

Açıklama: rsplit sağdan böler; ilk parça zincirin son fonksiyonudur.

3 Araç ve görevi

Kavram Anlamı
perf / samply Örnekleme profilleyici
cargo flamegraph Alev grafiği üretir
debug = true Release'te semboller
criterion Mikro benchmark

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