optimization - 在 Rust 中空函数会被优化掉吗?

标签 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() 为空,对 foo() 的调用会被优化掉吗?

最佳答案

只需在惊人的 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,循环将被完全删除。

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

关于optimization - 在 Rust 中空函数会被优化掉吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43233804/

相关文章:

algorithm - 有效查找查询范围内整数的数据结构

sql - 如何使用Explain Plan来优化查询?

c++ - 除法作为乘法和 LUT ?/fast float 除法倒数

mysql - 使用两行从另一个表中删除重复项的最快方法

multithreading - 是否可以在不进行任何克隆的情况下与线程共享数据?

rust - 如何在方法中获取对结构域的可变引用并调用其他方法而不会借用检查器提示? [复制]

rust - 如何将 Vec<> 传播到 format!() 的参数中?

c# - 方阵上的最佳图形排列

struct - 为什么要在结构中对引用使用相同的生命周期?

rust - 为什么这个 rppal I2c 结构没有任何方法?