Я хотел знать, как быстро вызов виртуальной функции единичного наследования по сравнению с одним тем же повышением:: вызов функции. Они почти то же в производительности, или повышение:: функционировать медленнее?
Я знаю, что производительность может варьироваться от случая до случая, но, как правило, который быстрее, и к, как значительная степень то, что так?
Спасибо, Guilherme
- редактирование
Тест KennyTM был достаточно убедителен для меня. повышение:: функция, кажется, не что намного медленнее, чем 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
, затем время с временем
,
Рассматривая код ассемблера, кажется, что медленность может быть вызвана исключениями и обработкой возможности, и что f
может быть NULL. Но учитывая, что цена одного вызова boost::function
составляет всего 2.4 наносекунды (на моей машине с частотой 2 ГГц), реальный код в вашем do_x()
может затенять это в значительной степени. Я бы сказал, что это не причина, чтобы избежать boost::функции
.