我用 Rust 编写了两个空函数,希望使用每个函数来测试向量上保留的使用或迭代器上过滤器的使用,在为每种情况编写空函数后,在运行程序时,我注意到两者之间存在巨大差异每个函数的持续时间,这意味着向当前空函数添加任何逻辑都会导致对其执行时间得出错误的结论。
use std::time::Instant;
fn use_filter() {
}
fn use_retain() {
}
fn main() {
let _start_1 = Instant::now();
use_filter();
println!("Use Filter duration: {:?}", Instant::now() - _start_1);
let _start_2 = Instant::now();
use_retain();
println!("Use Retain duration: {:?}", Instant::now() - _start_2);
}
预期产量
Use Filter duration: xns
Use Retain duration: xns
其中 x 对于两个函数来说是相同的,因为它们都是空的并且不执行任何操作
实际产量
Use Filter duration: 110ns
Use Retain duration: 40ns
什么可以解释 Rust 编程语言中执行时间截然不同的空函数。
问题中给出的结果完全是由于噪音造成的,并且没有携带任何有用的信息。代码编译后的结果是
movq std::time::Instant::now@GOTPCREL(%rip), %r14
callq *%r14 // First call to `Instant::now()`
movq %rax, %rbx
// `use_filter` went away entirely, as one would expect
movl %edx, %ebp
callq *%r14 // Second call to `Instand::now()`
movq %rax, %rdi
movl %edx, %esi
movq %rbx, %rdx
movl %ebp, %ecx
callq *<std::time::Instant as core::ops::arith::Sub>::sub@GOTPCREL(%rip)
// [...] print result
callq *%r14 // Third call to `Instant::now()`
movq %rax, %rbx
// `use_retention` went away entirely
movl %edx, %ebp
callq *%r14 // Third call to `Instant::now()`
movq %rax, %rdi
movl %edx, %esi
movq %rbx, %rdx
movl %ebp, %ecx
callq *<std::time::Instant as core::ops::arith::Sub>::sub@GOTPCREL(%rip)
// [...] print result
也就是说,您测量的时间差是向
Instant::now()
发出两次调用所花费的时间,其间没有没有任何。没有什么区别。您看到的时间差是由Instant::now()
实现中的不准确、线程调度或一般噪音引起的。