В качестве особого случая рассмотрите возможность вызова пустой функции 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: (с усилением 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
,
- Код А занимает 0,30 секунды.
- Код B занимает 0,54 секунды.
Изучая код сборки, кажется, что медлительность может быть связана с исключениями и обработкой возможности, а f
может иметь значение NULL. Но, учитывая, что цена одного boost::function
вызова составляет всего 2,4 наносекунды (на моей машине с частотой 2 ГГц), реальный код в вашем do_x()
может затмить это. Я бы сказал, это не повод избегать boost::function
.