我有这段代码:
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)。
答案 0 :(得分:1)
我的猜测是控制台输出延迟,CPU中的冷缓存(与运行基准测试的httpRequest: function () {
return fetch(document.querySelector("a").href)
.then(response => response.text())
}
相比)和链接的组合。
向下钻取的一种快捷方法是使用cargo bench
为main()
计算时间。如果这更接近8ms,那么它很可能是准备执行的开销(fork,link exec)。
如果确实想知道,系统范围的分析(即Linux中的std::time::Instant
)可能是唯一可以确定的方法。
答案 1 :(得分:1)
结果不表明运行整个程序需要8毫秒,但运行fizz
函数需要大约8毫秒。但是,bencher不止一次地运行该函数以确保结果是可重复的。因此,+/- 681,134
可以衡量运行之间的差异程度。
更具体地说,8ms是多次运行的中间时间,而+/- 681,134 ns
是观察到的最大和最小运行时间之间的差异。