我正在解析一些文本。我需要支持unicode文本,这就是为什么我要使用String::chars
迭代器:
use std::time::Instant;
fn main() {
let text = "a".repeat(10000);
let mut timer1 = 0;
let mut timer2 = 0;
let start1 = Instant::now();
for pos in 1..10000 {
let start2 = Instant::now();
let ch = text.chars().nth(pos).unwrap();
timer2 += start2.elapsed().as_millis();
}
timer1 += start1.elapsed().as_millis();
println!("timer1: {} timer2: {}", timer1, timer2);
}
输出示例:
timer1: 4276 timer2: 133
当我认为它们应该彼此非常接近时,为什么timer2
比令人难以置信的要小timer1
?
PS我已经知道那.nth
很慢,不应该使用。
您遇到了解决问题。循环内部执行平均需要不到一毫秒的时间,因此start2.elapsed().as_millis()
通常求值为0。要解决此问题,您可以在循环内部执行一些操作,而该操作甚至需要更长的时间,或者将分辨率从毫秒更改为更小的值,例如微秒或纳秒。
切换到微秒会产生更一致的时间
use std::time::{Instant};
fn main() {
let text = "a".repeat(10000);
let mut timer1 = 0;
let mut timer2 = 0;
let start1 = Instant::now();
for pos in 1..10000 {
let start2 = Instant::now();
let ch = text.chars().nth(pos).unwrap();
timer2+=start2.elapsed().as_micros();
}
timer1+=start1.elapsed().as_micros();
println!("timer1: {} timer2: {}", timer1, timer2);
}
输出
timer1: 3511812 timer2: 3499669
这个问题被标记为性能,因此我想指出使用std::Instant
来衡量性能非常乏味。更好的方法包括criteria.rs,firegraph和cargo-bench。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句