使用stable/beta时忽略基准测试

Dom*_*ler 8 benchmarking rust

我有一个带有一些基准测试和测试的文件,并希望测试稳定,测试版和夜间测试.但是,要么我不使用基准测试或稳定/ beta投诉.有没有办法在使用stable/beta时隐藏所有基准测试部分?

作为示例,本书中的以下代码:

#![feature(test)]

extern crate test;

pub fn add_two(a: i32) -> i32 {
    a + 2
}

#[cfg(test)]
mod tests {
    use super::*;
    use test::Bencher;

    #[test]
    fn it_works() {
        assert_eq!(4, add_two(2));
    }

    #[bench]
    fn bench_add_two(b: &mut Bencher) {
        b.iter(|| add_two(2));
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用rustup并希望使用相同的文件来处理所有构建,调用类似于:

rustup run nightly cargo bench --bin bench --features "bench"
rustup run nightly cargo test --bin bench --features "bench"
rustup run beta cargo test --bin bench
rustup run stable cargo test --bin bench
Run Code Online (Sandbox Code Playgroud)

我可以隐藏#![feature(test)]#![cfg_attr(feature = "bench", feature(test))].我可以做一些类似于其他基准部分的事情吗?什么是功能标志的好资源?

She*_*ter 16

在我的项目中,我将基准测试放在一个单独的模块中,就像我测试一样.然后我创建了一个货物功能,使他们能够.在这段摘录中,我使用了功能名称unstable,但您可以使用任何您喜欢的内容:

Cargo.toml

# ...

[features]
unstable = []

# ...
Run Code Online (Sandbox Code Playgroud)

SRC/lib.rs

#![cfg_attr(feature = "unstable", feature(test))]

#[cfg(test)]
mod tests {
    #[test]
    fn a_test() {
        assert_eq!(1, 1);
    }
}

#[cfg(all(feature = "unstable", test))]
mod bench {
    extern crate test;
    use self::test::Bencher;

    #[bench]
    fn a_bench(b: &mut Bencher) {
        let z = b.iter(|| {
            test::black_box(|| {
                1 + 1
            })
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

#[cfg(all(feature = "unstable", test))]如果设置了该功能并且我们正在以测试模式进行编译,该行表示仅编译以下项目.同样,#![cfg_attr(feature = "unstable", feature(test))]仅在启用该test功能时unstable启用功能标志.

这是野外的一个例子.


Ste*_*nik 7

Cargo支持基准测试目录.如果你把它们放在那里,你可以永远不要在beta/stable上运行"货物工作台",并且只能在夜间运行它.


mal*_*rbo 6

有没有办法在使用stable/beta时隐藏所有基准测试部分?

是的,您可以使用构建脚本自动执行此操作,因此无需--features在执行货物时指定.在构建脚本中,您可以检测Rust编译器的版本并定义一个功能("nightly"例如).然后,在源代码中,您可以对基准进行分组,并在定义功能时启用它们.

Cargo.toml

[package]
build = "build.rs"

[features]
nightly = []

[build-dependencies]
rustc_version = "0.1.*"
Run Code Online (Sandbox Code Playgroud)

build.rs

extern crate rustc_version;

use rustc_version::{version_meta, Channel};

fn main() {
    if version_meta().channel == Channel::Nightly {
        println!("cargo:rustc-cfg=feature=\"nightly\"");
    }
}
Run Code Online (Sandbox Code Playgroud)

src/lib.rs

#![cfg_attr(all(feature = "nightly", test), feature(test))]

#[cfg(all(feature = "nightly", test))]
extern crate test;

pub fn add_two(a: i32) -> i32 {
    a + 2
}

#[cfg(test)]
mod tests {
    // tests
}

#[cfg(all(feature = "nightly", test))]
mod benchs {
    use test::Bencher;
    // benchs
}
Run Code Online (Sandbox Code Playgroud)