Вызов виртуальной функции в C ++ по сравнению с boost :: function - PullRequest
5 голосов
/ 30 января 2010

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

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

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

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

Тест Кенни ТМ был достаточно убедительным для меня. Кажется, что boost :: function не намного медленнее, чем vcall для моих собственных целей. Спасибо.

1 Ответ

7 голосов
/ 30 января 2010

В качестве особого случая рассмотрите возможность вызова пустой функции 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...