كيفية قياس أداء الكود في Rust بشكل صحيح: المقارنة المعيارية والتنميط
مرحبًا أيها الزملاء! أكتب بلغة Rust منذ حوالي ستة أشهر وواجهت مشكلة: لا أستطيع قياس الوقت الذي يستغرقه كودي بشكل صحيح. حاولت استخدام std::time::Instant، لكن النتائج تتغير من تشغيل إلى آخر، خاصةً في الدوال الصغيرة. على سبيل المثال، أريد مقارنة طريقتين لجمع متجه:
```rust
use std::time::Instant;
fn sum_for(v: &[i32]) -> i32 {
let mut sum = 0;
for x in v { sum += x; }
sum
}
fn sum_iter(v: &[i32]) -> i32 {
v.iter().sum()
}
fn main() {
let data = vec![1; 1_000_000];
let start = Instant::now();
let _ = sum_for(&data);
println!("for: {:?}", start.elapsed());
let start = Instant::now();
let _ = sum_iter(&data);
println!("iter: {:?}", start.elapsed());
}
```
على حاسوبي المحمول (Ryzen 5، Linux)، يُظهر القياس الأول 0.5-1.2 مللي ثانية، والثاني 0.3-0.9 مللي ثانية، وأحيانًا يتغير الترتيب. أفهم أن هذا بسبب العمليات الخلفية، وذاكرة التخزين المؤقت، وما إلى ذلك، ولكن كيف يمكنني الحصول على أرقام مستقرة؟