簡體   English   中英

為什么運行 cargo bench 比運行 release build 快?

[英]Why is running cargo bench faster than running release build?

我想對我的 Rust 程序進行基准測試,並正在比較一些替代方案。 然而,我注意到,當使用cargo benchbencher crate 運行基准測試時,代碼運行速度始終比使用相同代碼運行生產構建( cargo build --release )時更快。 例如:

主要代碼:

use dot_product;
const N: usize = 1000000;

use std::time;
fn main() {
    let start = time::Instant::now();
    dot_product::rayon_parallel([1; N].to_vec(), [2; N].to_vec());
    println!("Time: {:?}", start.elapsed());
}

平均時間:~20ms

基准代碼:

#[macro_use]
extern crate bencher;

use dot_product;

use bencher::Bencher;

const N: usize = 1000000;

fn parallel(bench: &mut Bencher) {
    bench.iter(|| dot_product::rayon_parallel([1; N].to_vec(), [2; N].to_vec()))
}

benchmark_group!(benches, sequential, parallel);
benchmark_main!(benches);

時間: 5,006,199 ns/iter (+/- 1,320,975)

我對其他一些程序進行了同樣的嘗試,而cargo bench提供了始終如一的更快結果。 為什么會發生這種情況?

正如評論所建議的,您應該在基准測試代碼中的所有(最終)結果上使用criterion::black_box() 這個 function 什么都不做 - 只是返回它唯一的參數 - 但對優化器是不透明的,所以編譯器必須假設 function 對輸入做了一些事情

當不使用black_box()時,基准測試代碼實際上不會做任何事情,因為編譯器能夠確定您的代碼的結果是未使用的,並且不會觀察到任何副作用。 因此,它會在消除死代碼期間刪除您的所有代碼,而您最終進行基准測試的是基准測試套件本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM