2010-01-30 7 views
5

Я хотел знать, как быстро происходит вызов виртуальной функции с одним наследованием по сравнению с одним вызовом boost :: function. Являются ли они почти такими же, как производительность, или функция boost :: function медленнее?C++ вызов виртуальной функции в сравнении с boost :: function call speedwise

Я знаю, что производительность может варьироваться от случая к случаю, но, как правило, это быстрее, и насколько это так важно?

Спасибо, Гильерме

- редактировать

тест KennyTM был достаточно убедительным для меня. Функция boost :: не кажется намного медленнее, чем vcall для моих собственных целей. Благодарю.

+1

также, это микро-оптимизация ... –

ответ

7

В качестве особого случая, позвоните по пустой функции 10 раз.


код А:

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 ГГц), фактический код в вашем do_x() мог бы сфокусировать это в значительной степени. Я бы сказал, это не повод избежать boost::function.

+1

А где единичное наследство в случае A? ;) –

+1

@gf: Вы знаете, как работает vtable? Наследование не имеет значения, потому что копируется вся vtable. – kennytm

+3

Хотя такой быстрый тест действительно очень полезен, он только сообщает вам, как код ведет себя с точки зрения производительности при определенных условиях (тестовый сценарий, компилятор, настройки компилятора, платформа и т. Д.). Это не отрицание вашего результата, я просто напоминаю о том, чтобы быть осторожным при обобщении из одного тестового примера. – sbi