性能測試
單元測試是用來校驗程序的正確性的,然而,程序能正常運行後,往往還需要測試程序(一部分)的執行速度,這時,f就需要用到性能測試。 通常來講,所謂性能測試,指的是測量程序運行的速度,即運行一次要多少時間(通常是執行多次求平均值)。Rust 竟然連這個特性都集成在語言基礎特性中,真的是一門很重視工程性的語言。
下面直接說明如何使用。
cargo new benchit
cd benchit
編輯 src/lib.rs 文件,在裡面添加如下代碼:
#![allow(unused)] #![feature(test)] fn main() { 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)); } } }
注意:
- 這裡雖然使用了 extern crate test;,但是項目的Cargo.toml文件中依賴區並不需要添加對test的依賴;
- 評測函數 fn bench_add_two(b: &mut Bencher) {}上面使用#[bench]做標註,同時函數接受一個參數,b就是 Rust 提供的評測器。這個寫法是固定的。
然後,在工程根目錄下,執行
cargo bench
輸出結果類似如下:
$ cargo bench
   Compiling benchit v0.0.1 (file:///home/mike/tmp/benchit)
     Running target/release/benchit-91b3e234d4ed382a
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
可以看到,Rust 的性能測試是以納秒 ns 為單位。
寫測評代碼的時候,需要注意以下一些點:
- 只把你需要做性能測試的代碼(函數)放在評測函數中;
- 對於參與做性能測試的代碼(函數),要求每次測試做同樣的事情,不要做累積和改變外部狀態的操作;
- 參數性能測試的代碼(函數),執行時間不要太長。太長的話,最好分成幾個部分測試。這也方便找出性能瓶頸所在地方。