【问题标题】:C++ virtual function call versus boost::function call speedwiseC++ 虚函数调用与 boost::function 快速调用
【发布时间】:2011-01-11 03:46:42
【问题描述】:

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

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

谢谢, 吉尔赫姆

--编辑

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

【问题讨论】:

  • 另外,这是一个微优化...

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


【解决方案1】:

作为一个非常特殊的情况,考虑调用一个空函数 109 次。


代码 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的理由。

【讨论】:

  • 那么案例 A 中的单一继承在哪里? ;)
  • @gf:你知道 vtable 是如何工作的吗?继承无关紧要,因为整个 vtable 都被复制了。
  • 虽然如此快速的测试确实非常有帮助,但它只会告诉您代码在特定条件下(测试用例、编译器、编译器设置、平台等)的性能表现如何。这并不是要否认您的结果,我只是提醒您在从单个测试用例进行概括时要小心。
  • 大概是的,但不是每个实现都实际做的。
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2020-06-05
  • 2010-10-15
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多