C++虚函数调用与boost :: function调用speedwise

Gui*_*ira 5 c++ performance virtual-functions boost-function

我想知道与一个相同的boost :: function调用相比,单继承虚函数调用的速度有多快.它们的性能几乎相同,还是boost :: function慢?

我知道性能可能因情况而异,但是,作为一般规则,哪个更快,哪个程度如此之大?

谢谢,Guilherme

- 编辑

KennyTM的测试对我来说足够令人信服.对于我自己的目的,boost :: function似乎并不比vcall慢得多.谢谢.

ken*_*ytm 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;
}
Run Code Online (Sandbox Code Playgroud)

代码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;
}
Run Code Online (Sandbox Code Playgroud)

编译g++ -O3,然后与时间time,

  • 代码A需要0.30秒.
  • 代码B需要0.54秒.

检查汇编代码,似乎缓慢可能是由于异常和处理可能性,并且f可能是NULL.但鉴于一次boost::function通话的价格仅为2.4纳秒(在我的2 GHz机器上),你的实际代码do_x()可能会影响到这一点.我想说,这不是一个避免的理由boost::function.

  • 虽然这样的快速测试确实非常有用,但它只告诉您代码在特定条件下的性能如何(测试用例,编译器,编译器设置,平台等).这不是要否认你的结果,我只是提醒在从一个测试用例进行推广时要小心. (3认同)