我想知道与一个相同的 boost::function 调用相比,单继承虚函数调用有多快。它们的性能几乎相同还是 boost::function 更慢?
我知道性能可能因情况而异,但是,作为一般规则,哪个更快,在多大程度上是这样?
谢谢,吉尔赫姆
- 编辑
KennyTM 的测试足以让我信服。对于我自己的目的, boost::function 似乎并不比 vcall 慢得多。谢谢。
我想知道与一个相同的 boost::function 调用相比,单继承虚函数调用有多快。它们的性能几乎相同还是 boost::function 更慢?
我知道性能可能因情况而异,但是,作为一般规则,哪个更快,在多大程度上是这样?
谢谢,吉尔赫姆
- 编辑
KennyTM 的测试足以让我信服。对于我自己的目的, boost::function 似乎并不比 vcall 慢得多。谢谢。
作为一个非常特殊的情况,考虑调用一个空函数 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:(使用 boost 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
。