Özet - Derleme araçları
- Rust kursu
- Uzman
- Ders 42/46
- 5 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
let bas = std::time::Instant::now();
is();
let sure = bas.____();
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 |