内置基准测试工具的当前实现似乎会在运行 iter
调用中多次运行代码,每次运行外部 iter
的设置代码。当被基准测试的代码修改设置数据时,基准测试代码的后续迭代将不再基准测试相同的内容。
以一个具体的例子来说明,我正在测试从 Vec
中删除值所需的速度:
#![feature(test)]
extern crate test;
use test::Bencher;
#[bench]
fn clearing_a_vector(b: &mut Bencher) {
let mut things = vec![1];
b.iter(|| {
assert!(!things.is_empty());
things.clear();
});
}
这将失败:
test clearing_a_vector ... thread 'main' panicked at 'assertion failed: !things.is_empty()', src/lib.rs:11
执行类似的基准测试将一个元素推入向量中,结果显示,iter闭包被执行了近980百万次(取决于闭包的执行速度)。如果有一次运行符合我的期望,而还有数百万次不符合,则结果可能会非常误导人。
测试是使用Rust nightly 1.19.0 (f89d8d184 2017-05-30)进行的。
iter
块内所花费的时间将被用于基准测试。如果我将设置添加到该块中,则执行设置所需的时间将计入基准测试的一部分;我将不再仅计时相关函数(clear
),而也会计时无关代码。 - Shepmasterbench::run_once
方法可以运行基准测试的单个迭代。然而,我不确定如何使用它来获取具有统计意义的样本... - Matthieu M.