在 Rust 中测量时,两个空函数会产生不同的运行时间

问题描述 投票:0回答:1

我用 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 编程语言中执行时间截然不同的空函数。

function rust benchmarking
1个回答
0
投票

问题中给出的结果完全是由于噪音造成的,并且没有携带任何有用的信息。代码编译后的结果是

    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()
实现中的不准确、线程调度或一般噪音引起的。

© www.soinside.com 2019 - 2024. All rights reserved.