当我开发我的项目时,我发现 std::function 非常慢。
所以我试图知道为什么它真的很慢。
但我找不到明显的原因。
我认为What Cpu不能利用指令重排序优化和CPU管道,因为它不知道调用哪个函数是性能差的原因。
它使内存停滞并降低性能......
我对吗???
包装到 std::function 中的代码总是比直接将代码内联到调用位置慢。特别是如果您的代码非常短,例如 3-5 个 CPU 指令。
如果您的函数的代码相当大,有数百条指令,那么无论使用 std::function 还是其他调用/包装代码的机制都没有区别。
std::function 代码未内联。使用 std::function 包装器与在类中使用虚拟方法具有几乎相同的速度开销。不仅如此, std::function 机制看起来非常像虚拟调用机制,在这两种情况下,代码都不是内联的,并且指向代码的指针用于通过汇编程序指令来调用它call。
如果您确实需要速度,请使用 lambda 并将它们作为模板化参数传递,如下所示。如果可能的话(并且如果编译器决定它将提高速度),Lambda 总是内联的。
#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
}
Run Code Online (Sandbox Code Playgroud)
如果您查看上面示例的汇编代码(单击上面的在线尝试链接),那么您可以看到 lambda 代码是内联的,而 std::function 代码则不是。
模板参数总是比其他解决方案更快,您应该始终在需要多态性的地方使用模板,同时具有高性能。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1926 次  |  
        
|   最近记录:  |