在Rust中,空函数是否被优化了?

时间:2017-04-05 14:15:24

标签: optimization rust

我想在代码中的功能门后面放置一些影响函数调用的性能。如果该功能未启用,我想的是只是实现了该功能的空实现。这样,希望Rust编译器可以完全从函数中删除它。

这样的事情:

// Included if feature is enabled
fn foo() {
    // ...
}

// Included if the feature is disabled
fn foo() {}

// Performance critical code
for i in 1..1000000000 {
    // ...
    foo();
}

如果foo()的调用是空的,它会被优化掉吗?

2 个答案:

答案 0 :(得分:6)

只需在惊人的Compiler Explorer:)

中试一试

您的示例的结果程序集是:

example::main:
    push    rbp
    mov     rbp, rsp
    mov     eax, 1
.LBB0_1:
    xor     ecx, ecx
    cmp     eax, 1000000000
    setl    cl
    add     ecx, eax
    cmp     eax, 1000000000
    mov     eax, ecx
    jl      .LBB0_1
    pop     rbp
    ret

正如您所看到的,没有call指令,并且根本没有调用foo()。但是,您可能想知道为什么不删除循环,因为它对外界没有影响。我可以假设有时这些循环实际上用于在某种意义上浪费时间。如果将计数器减少到100,则完全删除循环。

无论如何:,优化器将删除空函数!

答案 1 :(得分:1)

根据我对当前稳定Rust的发布模式的检查,以下代码:

fn foo() {}


fn main() {
    for _ in 1..1000000000 {
        foo();
    }

    println!(); // a side effect so that the whole program is not optimized away
}

编译为同一个程序集,就好像循环为空:

for _ in 1..1000000000 {}