5

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

我知道性能可能因情况而异,但是,作为一般规则,哪个更快,在多大程度上是这样?

谢谢,吉尔赫姆

- 编辑

KennyTM 的测试足以让我信服。对于我自己的目的, boost::function 似乎并不比 vcall 慢得多。谢谢。

4

1 回答 1

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:(使用 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

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

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

于 2010-01-30T08:57:05.927 回答