一、性能测试
在rust中,只有lib.rs才可能进行extern crate的集成测试,二进制形式的测试是不可以的。原因在于rust的设计初衷就是在main.rs中尽量少完成功能,更多的功能转入到库中。这样,在二进制主程序中就不会有过多的性能来测试。在rust中,针对性能测试也提供了专门的属性#[bench]支持,这样就可以快速的在指定的场景资源情况进行资源测试,这在一门语言中还是比较少见的。
二、rust中如何进行性能测试
看下面的代码:
#![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));
}
}
其测试的结果:
running 2 tests
test tests::it_works ... ignored
test tests::bench_add_two ... bench: 1 ns/iter (+/- 0)
test result: ok. 0 passed; 0 failed; 1 ignored; 1 measured
从运行结果可以看到基础测试的单位是纳秒(ns);
rust这玩意儿不好使,版本太多,而且test这个属性本身是一个不稳定性的特性,如果使用stable版本会报“#![feature]
may not be used on the stable release channel”,即如果不是不稳定版本,需要安装一个nightly版本,有点尴尬。不过在社区中有一些提供了稳定的版本基准测试如criterion 等,有兴趣可以自己去github上下载下来试用一下。
三、总结
在写这个Rust的系列时,基本上看到的是冰火两重天,一方面有人嗷嗷叫好,另一方面,很多人都说这个太难学。确实是,搞这个测试就费了不少劲儿。rust的演进又比较快,一些老的文档又跟不上。这对初学者来说,绝对是个噩梦。但愿Rust能够快速的发展起来,能够在语言开发这个大家庭里有独到并重要的一个位置,而不是最终沦落成一个小众的产品。c/c++就是前车之辙。
努力吧,归来的少年!