Rust性能测试与宏的使用指南
1. I/O开销测量
在编写基准测试时,很容易意外地测量到错误的内容。例如,我们常常希望实时了解基准测试的进度,可能会编写如下代码来测量 my_function 的运行速度:
let start = std::time::Instant::now();
for i in 0..1_000_000 {
println!("iteration {}", i);
my_function();
}
println!("took {:?}", start.elapsed());
这段代码看似能实现目标,但实际上并没有真正测量 my_function 的速度。这个循环很可能只是在告诉我们打印一百万个数需要多长时间。循环体中的 println! 在幕后做了很多工作:将二进制整数转换为十进制数字以便打印,锁定标准输出,使用至少一个系统调用写出一系列UTF - 8代码点,然后释放标准输出锁。不仅如此,如果终端打印输入内容的速度很慢,系统调用可能会阻塞。相比之下,调用 my_function 所花费的时间可能就微不足道了。
类似的情况也会发生在基准测试使用随机数时。如果在循环中运行 my_function(rand::random()) ,很可能大部分时间都在测量生成一百万个随机数所需的时间。获取当前时间、读取配置文件或启动新线程也是如此,相对而言,这些操作都需要很长时间,可能会掩盖你实际想要测量的时间。
超级会员免费看
订阅专栏 解锁全文
692

被折叠的 条评论
为什么被折叠?



