我想知道与一个相同的boost :: function调用相比,单继承虚函数调用的速度有多快。它们的性能几乎相同,还是boost :: function更慢?
我知道性能可能会因情况而异,但是,作为一般规则,哪个更快,哪个程度如此之大?
谢谢, Guilherme的
- 编辑
KennyTM的测试对我来说足够令人信服。对于我自己的目的,boost :: function似乎并不比vcall慢得多。感谢。
答案 0 :(得分:7)
作为一个非常特殊的情况,考虑调用一个空函数10 9 次。
代码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
,
检查汇编代码,似乎缓慢可能是由于异常和处理可能性而导致f
可能为NULL。但考虑到一个boost::function
通话的价格只有2.4纳秒(在我的2 GHz机器上),你do_x()
中的实际代码可能会影响到这一点。我想说,这不是避免boost::function
的理由。