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

时间:2010-01-30 08:30:31

标签: c++ performance virtual-functions boost-function

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

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

谢谢, Guilherme的

- 编辑

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

1 个答案:

答案 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

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

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