Rust
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.
Örnek çözümü göster
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);
}
}
Kendini test et
-
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
Cevabı göster
Debug derlemede darboğazlar tamamen farklıdır; optimizasyonsuz soyutlamalar yanıltıcı sonuç verir — debug = true ile release derlemeye sembol eklenir; optimizasyon korunur, fonksiyon adları görünür.
-
Yaprağı al
let yaprak = yigin.____(';').next().unwrap();
Cevabı göster
let yaprak = yigin.rsplit(';').next().unwrap();
-
Araç ve görevi
- perf / samply
- Örnekleme profilleyici
- cargo flamegraph
- Alev grafiği üretir
- debug = true
- Release'te semboller
- criterion
- Mikro benchmark
Sıradaki ders: Unsafe yönergeleri