C++ 虚函数调用与 boost::function 调用的速度对比

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

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

我知道性能可能因情况而异,但作为一般规则,哪个更快,速度有多大?

谢谢, 吉列尔姆

-- 编辑

KennyTM 的测试对我来说足够有说服力。出于我自己的目的,boost::function 似乎并不比 vcall 慢多少。谢谢。

最佳答案

作为一种非常特殊的情况,考虑调用一个空函数 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:(提升 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 的理由。

关于C++ 虚函数调用与 boost::function 调用的速度对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2167293/

相关文章:

performance - 如何使用 Memcached 配置 NGINX 以提供 HTML

ruby - Ruby 有像 Python 那样的控制台 perf 工具吗?

c++ - 无法理解 C++ `virtual`

c++ - 强制使通用模板失败,但允许特化,加上 "method exists dispatching"

c++ - 打印 vector 的 vector

c++ - Singleton 实现之间的差异

c++ - C++03使用函数调用结果初始化多个成员?

performance - Apache NiFi 调优问题

c++ - 投给一个 child

c++ - 虚函数声明和定义的困惑