Optimization 空函数在Rust中得到优化了吗?

Optimization 空函数在Rust中得到优化了吗?,optimization,rust,Optimization,Rust,我想在代码中的一个特性门后面放置一些影响性能的函数调用。如果没有启用该功能,我会考虑只实现该功能的一个空实现。希望通过这种方式,Rust complier可以完全从函数中删除它 大概是这样的: // Included if feature is enabled fn foo() { // ... } // Included if the feature is disabled fn foo() {} // Performance critical code for i in 1..1

我想在代码中的一个特性门后面放置一些影响性能的函数调用。如果没有启用该功能,我会考虑只实现该功能的一个空实现。希望通过这种方式,Rust complier可以完全从函数中删除它

大概是这样的:

// 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()为空,对它的调用会得到优化吗?

根据我对当前稳定的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 {}

就在神奇的地方试试吧:)

示例的结果程序集为:

example::main:
推动rbp
mov rbp,rsp
mov-eax,1
.LBB0_1:
异或ecx,ecx
cmp eax,1000000000
setl cl
添加ecx、eax
cmp eax,1000000000
mov-eax,ecx
jl.LBB0_1
流行限制性商业惯例
ret
如您所见,没有
调用
指令,而且根本没有调用
foo()
。但是,您可能想知道为什么不删除循环,因为它对外部世界没有影响。我可以假设,有时候这些循环实际上在某种意义上被用来浪费时间。如果将计数器减小到
100
,则循环将完全删除


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

我想知道为什么循环本身没有被移除,谢谢你提到它;也许有人可以解释这种行为。这种循环行为真的很奇怪(尤其是100阈值)。当使用Clang时,这些循环被完全移除,因此我假设LLVM也能够处理Rust,但我似乎无法触发它:x@MatthieuM. 循环通过
让mut i=1_000_000_000进行优化;当i>0{foo();i-=1;}
时,您可以传递
-C remark=all
以查看优化备注。循环未能优化,因为@paholg@matthieum“无法确定循环迭代次数”刚刚在上提交了一个关于循环优化的问题以供记录。