gpt4 book ai didi

performance - 为什么计时器显示的内容如此违反直觉?

转载 作者:行者123 更新时间:2023-11-29 08:11:52 25 4
gpt4 key购买 nike

我正在制作一些文本的解析器。我需要支持 unicode 文本,这就是我使用 String::chars 迭代器的原因:

playground

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,而我认为它们应该彼此非常接近?

附言我已经知道 .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 是一种非常乏味的性能测量方法。更好的方法包括 criterion.rs , flamegraphcargo-bench .

关于performance - 为什么计时器显示的内容如此违反直觉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59044638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com