Виртуальная функция C++ звонит по сравнению с повышением:: вызов функции speedwise

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

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

Спасибо, Guilherme

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

Тест KennyTM был достаточно убедителен для меня. повышение:: функция, кажется, не что намного медленнее, чем vcall в моих собственных целях.Спасибо.

5
задан Guilherme Vieira 30 January 2010 в 12:09
поделиться

1 ответ

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

  • Код A занимает 0.30 секунды.
  • Код B занимает 0.54 секунды.

Рассматривая код ассемблера, кажется, что медленность может быть вызвана исключениями и обработкой возможности, и что f может быть NULL. Но учитывая, что цена одного вызова boost::function составляет всего 2.4 наносекунды (на моей машине с частотой 2 ГГц), реальный код в вашем do_x() может затенять это в значительной степени. Я бы сказал, что это не причина, чтобы избежать boost::функции.

7
ответ дан 14 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: