我想知道与同一个 boost::function 调用相比,单继承虚函数调用的速度有多快。它们的性能几乎相同还是 boost::function 更慢?
我知道性能可能因情况而异,但作为一般规则,哪个更快,速度有多大?
谢谢, 吉列尔姆
-- 编辑
KennyTM 的测试对我来说足够有说服力。出于我自己的目的,boost::function 似乎并不比 vcall 慢多少。谢谢。
最佳答案
作为一种非常特殊的情况,考虑调用一个空函数 109 次。
代码A:
struct X {
virtual ~X() {}
virtual void do_x() {};
};
struct Y : public X {}; // for the paranoid.
int main () {
Y* x = new Y;
for (int i = 100000000; i >= 0; -- i)
x->do_x();
delete x;
return 0;
}
代码 B:(提升 1.41):
#include <boost/function.hpp>
struct X {
void do_x() {};
};
int main () {
X* x = new X;
boost::function<void (X*)> f;
f = &X::do_x;
for (int i = 100000000; i >= 0; -- i)
f(x);
delete x;
return 0;
}
用g++ -O3
编译,然后用time
计时,
- 代码 A 耗时 0.30 秒。
- 代码 B 耗时 0.54 秒。
查看汇编代码,似乎慢可能是由于异常和处理的可能性,f
可以为NULL。但考虑到一次 boost::function
调用的价格仅为 2.4 纳秒(在我的 2 GHz 机器上),您的 do_x()
中的实际代码可能会影响到这一点.我会说,这不是避免 boost::function
的理由。
关于C++ 虚函数调用与 boost::function 调用的速度对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2167293/