Rust基准测试 benchmark

基准测试 benchmark

几乎所有开发都知道,如果要测量程序的性能,就需要性能测试。

性能测试包含了两种:压力测试和基准测试。前者是针对接口 API,模拟大量用户去访问接口然后生成接口级别的性能数据;而后者是针对代码,可以用来测试某一段代码的运行速度,例如一个排序算法。

而本文将要介绍的就是基准测试 benchmark,在 Rust 中,有两种方式可以实现:

  • 官方提供的 benchmark
  • 社区实现,例如 criterion.rs

事实上我们更推荐后者,原因在后文会详细介绍,下面先从官方提供的工具开始。

官方 benchmark

官方提供的测试工具,目前最大的问题就是只能在非 stable 下使用,原因是需要在代码中引入 test 特性: #![feature(test)]

设置 Rust 版本

因此在开始之前,我们需要先将当前仓库中的 Rust 版本stable 切换为 nightly:

  1. 安装 nightly 版本:$ rustup install nightly
  2. 使用以下命令确认版本已经安装成功
$ rustup toolchain list
stable-aarch64-apple-darwin (default)
nightly-aarch64-apple-darwin (override)
  1. 进入 adder 项目(之前为了学习测试专门创建的项目)的根目录,然后运行 rustup override set nightly,将该项目使用的 rust 设置为 nightly

很简单吧,其实只要一个命令就可以切换指定项目的 Rust 版本,例如你还能在基准测试后再使用 rustup override set stable 切换回 stable 版本。

使用 benchmark

当完成版本切换后,就可以开始正式编写 benchmark 代码了。首先,将 src/lib.rs 中的内容替换成如下代码:

#![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));
    }
}

可以看出,benchmark 跟单元测试区别不大,最大的区别在于它是通过 #[bench] 标注,而单元测试是通过 #[test] 进行标注,这意味着 cargo test 将不会运行 benchmark 代码:

$ cargo test
running 2 tests
test tests::bench_add_two ... ok
test tests::it_works ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measu

你可能感兴趣的:(rust,log4j,开发语言,面试,算法,后端,测试)