<分区>
当我开发我的项目时,我发现 std::function 真的很慢。
所以我想知道为什么它真的很慢。
但我找不到明显的原因。
我认为 What Cpu 不能利用指令重排序优化和 cpu 流水线,因为它不知道调用哪个函数是性能不佳的原因。
它会使内存停滞并降低性能....
我说得对吗???
<分区>
当我开发我的项目时,我发现 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
}
如果您查看上面示例的汇编代码(点击上面的在线试用链接),您可以看到 lambda 代码是内联的,而 std::function 代码不是。
模板参数总是比其他解决方案更快,您应该始终在任何需要多态性同时具有高性能的地方使用模板。
关于c++ - 为什么 std::function 太慢是因为 CPU 无法利用指令重新排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67615330/