为什么我的程序比基准测试节目慢?

时间:2018-03-11 10:31:23

标签: ubuntu rust

我有这段代码:

fn main() {
    let s = "string";
    let res = fizz(s);
    println("{}", res);
}

fn fizz(s: &str) -> String {
    // Does something heavy
}

#[bench]
fn fizz_time(b: &mut Bencher) {
    let s = "string";
    b.iter(|| {
        fizz(s);
    });
}

基准测试结果是:

⟩ cargo bench
running 1 tests
test test::fizz_time ... bench:   8,215,412 ns/iter (+/- 681,134)

这表示执行整个程序大约需要8ms,但是当我运行由cargo build --release构建的可执行文件时,执行大约需要50ms:

⟩ time -v ./target/release/fizz_test 
03b14f36de9aa6c85a87f29cceb21c6f972e94170d8f32c321ae7b6785c4043b5f
        Command being timed: "./target/release/fizz_test"
        User time (seconds): 0.05
        System time (seconds): 0.00
        Percent of CPU this job got: 95%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.06
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 2876
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 136
        Voluntary context switches: 0
        Involuntary context switches: 75
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

为什么会这样?与函数相比,执行main是一项繁重的任务吗?基准测试不正确吗?

我使用的是Ubuntu 17.10 64bit(内核4.13.0-36-lowlatency)。

2 个答案:

答案 0 :(得分:1)

我的猜测是控制台输出延迟,CPU中的冷缓存(与运行基准测试的httpRequest: function () { return fetch(document.querySelector("a").href) .then(response => response.text()) } 相比)和链接的组合。

向下钻取的一种快捷方法是使用cargo benchmain()计算时间。如果这更接近8ms,那么它很可能是准备执行的开销(fork,link exec)。

如果确实想知道,系统范围的分析(即Linux中的std::time::Instant)可能是唯一可以确定的方法。

答案 1 :(得分:1)

结果表明运行整个程序需要8毫秒,但运行fizz函数需要大约8毫秒。但是,bencher不止一次地运行该函数以确保结果是可重复的。因此,+/- 681,134可以衡量运行之间的差异程度。

更具体地说,8ms是多次运行的中间时间,而+/- 681,134 ns是观察到的最大和最小运行时间之间的差异。

另见How do I interpret the output of `cargo bench`?