5

同じ boost::function 呼び出しと比較した場合、単一継承の仮想関数呼び出しがどのくらい速いか知りたいと思っていました。それらはパフォーマンスがほぼ同じですか、それともboost::functionの方が遅いですか?

パフォーマンスはケースごとに異なる場合があることは認識していますが、一般的なルールとして、どちらがより高速で、どの程度ですか?

ありがとう、ギエルメ

- 編集

KennyTM のテストは、私にとって十分に説得力がありました。私自身の目的では、boost::function は vcall よりもそれほど遅くはないようです。ありがとう。

4

1 に答える 1

7

非常に特殊なケースとして、空の関数を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である可能性があります。しかし、1回の呼び出しの価格がboost::function(私の2 GHzマシンでは)わずか2.4ナノ秒であることを考えると、実際のコードはdo_x()これをかなり覆い隠す可能性があります。私は言うでしょう、それは避ける理由ではありませんboost::function

于 2010-01-30T08:57:05.927 に答える