如何对改变设置数据的代码进行基准测试?

6

内置基准测试工具的当前实现似乎会在运行 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)进行的。

这是另一个之前在这里的问题的转载,但似乎已被删除。尽管如此,我仍然想知道答案! - Shepmaster
@ljedrz iter 块内所花费的时间将被用于基准测试。如果我将设置添加到该块中,则执行设置所需的时间将计入基准测试的一部分;我将不再仅计时相关函数(clear),而也会计时无关代码。 - Shepmaster
似乎有一个bench::run_once方法可以运行基准测试的单个迭代。然而,我不确定如何使用它来获取具有统计意义的样本... - Matthieu M.
除了 bench::run_once,还有更好的方法吗? - user6573388
1个回答

0

看看最近发布的 Rust 代码基准测试工具 pew。它允许您进行一次设置,然后将其克隆到每个基准测试中,或通过暂停/恢复基准测试手动运行设置。

这个库还处于非常早期的阶段,但它可能是您正在寻找的东西。欢迎贡献。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接