非常に特殊なケースとして、空の関数を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
。