为何Rust中首次迭代运行时远高于后续连续步骤?
问题:首次迭代运行时远高于后续迭代的原因
以下结果一目了然。最终的元测量证明我此前的猜测(测量本身耗时较多)不成立。首次迭代的平均运行时是后续步骤+3次测量时间的4倍以上。请问这是什么原因?
测试代码
use std::time::Instant; fn main() { let v:Vec<(i128,i128)>=vec![ (23,55007766), (45,55884433), (42,22663355) ]; for i in v{ let now_ = Instant::now(); let now = Instant::now(); let part1 = i.0*i.1; let then = Instant::now(); println!("runtime_part1: {} ns",(then-now).as_nanos()); let now = Instant::now(); let part2 = part1*i.1; let then = Instant::now(); println!("runtime_part2: {} ns",(then-now).as_nanos()); let now = Instant::now(); let part3 = i.0+part2; let then = Instant::now(); println!("runtime_part3: {} ns",(then-now).as_nanos()); let then_ = Instant::now(); println!("runtime_iter: {} ns",(then_-now_).as_nanos()); }; let now = Instant::now(); let now_ = Instant::now(); (|| 123123*123123); let then_ = Instant::now(); println!("print: {} ns",(then_-now_).as_nanos()); let then = Instant::now(); println!("runtime_measurement: {} ns",(then-now).as_nanos()); }
运行输出
runtime_part1: 30 ns runtime_part2: 50 ns runtime_part3: 40 ns runtime_iter: 23121 ns runtime_part1: 40 ns runtime_part2: 40 ns runtime_part3: 30 ns runtime_iter: 2440 ns runtime_part1: 30 ns runtime_part2: 40 ns runtime_part3: 30 ns runtime_iter: 2390 ns print: 30 ns runtime_measurement: 960 ns
原因分析
首次迭代的高耗时核心原因是标准IO的初始化开销:
- 代码中第一次调用
println!时,Rust标准库需要完成stdio系统的初始化工作,包括输出流配置、相关系统资源分配等,这部分额外开销只会在首次执行时产生。 - 后续迭代中,stdio环境已经完成初始化,
println!仅需处理实际打印逻辑,耗时自然大幅降低。 - 从输出数据也能验证这一点:首次
runtime_iter包含了3次println!的初始化成本,而后续迭代的runtime_iter仅为正常打印+计算的开销,两者差距正好对应首次IO初始化的额外耗时。
另外,debug模式下Rust编译器未做充分优化,也会让初始化的开销表现得更明显,但这不是核心因素。
内容的提问来源于stack exchange,提问作者tommy1213
相关产品推荐
相关产品推荐

