c++ - 为什么 std::function 太慢是因为 CPU 无法利用指令重新排序?

标签 c++ c++11

<分区>

当我开发我的项目时,我发现 std::function 真的很慢。
所以我想知道为什么它真的很慢。
但我找不到明显的原因。

我认为 What Cpu 不能利用指令重排序优化和 cpu 流水线,因为它不知道调用哪个函数是性能不佳的原因。 它会使内存停滞并降低性能....

我说得对吗???

最佳答案

包装到 std::function 中的代码总是比将代码直接内联到调用位置慢。特别是如果您的代码非常短,例如 3-5 条 CPU 指令。

如果您的函数代码非常大,有数百条指令,那么使用 std::function 或其他一些调用/包装代码的机制将没有区别。

std::function 代码不是内联的。使用 std::function 包装器的速度开销与在类中使用虚拟方法几乎相同。不仅如此,std::function 机制看起来非常像虚拟调用机制,在这两种情况下,代码都不是内联的,而是使用指向代码的指针通过汇编程序的 call 指令调用它。

如果您真的需要速度,请使用 lambda 并将它们作为模板化参数传递,如下所示。如果可能,Lambda 总是内联的(如果编译器决定它会提高速度)。

Try it online!

#include <functional>

template <typename F>
void __attribute__((noinline)) use_lambda(F const & f) {
    auto volatile a = f(13); // call f
    // ....
    auto volatile b = f(7); // call f again
}

void __attribute__((noinline)) use_func(
        std::function<int(int)> const & f) {
    auto volatile a = f(11); // call f
    // ....
    auto volatile b = f(17); // call f again
}

int main() {
    int x = 123;
    auto f = [&](int y){ return x + y; };
    use_lambda(f); // Pass lambda
    use_func(f); // Pass function
}

如果您查看上面示例的汇编代码(点击上面的在线试用链接),您可以看到 lambda 代码是内联的,而 std::function 代码不是。

模板参数总是比其他解决方案更快,您应该始终在任何需要多态性同时具有高性能的地方使用模板。

关于c++ - 为什么 std::function 太慢是因为 CPU 无法利用指令重新排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67615330/

相关文章:

c++ - 从派生类访问基类公共(public)成员

c++ - C++ : How to correctly actualize a file against power loss?

c++ - 如何清除 C++ 结构化数组中的数据?

c++ - 是否需要标准分配器来分配连续内存?

c++ - 迭代可变参数模板类的基类

c++ - 用 g++ 编译 C++11

c++ - 线程安全、无数据争用、无滞后共享容器 (circular_buffer)

c++ - ARM 系统调用作为 C++ 模板

c++ - 捕获标准输入而不将字符回显到屏幕

c++ - 检查引用元组是否默认可构造时出错