Profiling
- Rust kursu
- Uzman
- Ders 40/46
- 4 dk
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 = trueFlamegraph'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'dainferno 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
use std::collections::BTreeMap;
fn main() {
// buraya yaz
}Örnek çözüm
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
let yaprak = yigin.____(';').next().unwrap();
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 |