Виртуальные функции и производительность C ++

Прежде чем вы съежитесь от повторяющегося заголовка, другой вопрос не подходил к тому, что я задаю здесь (ИМО). Итак.

Я действительно хочу использовать виртуальные функции в своем приложении, чтобы упростить работу в сто раз (разве не в этом суть ООП;)). Но я где-то читал, что они приходятся дорого, не видя ничего, кроме той же старой надуманной шумихи о преждевременной оптимизации, я решил быстро покрутить ее в небольшом тесте производительности, используя:

CProfiler.cpp

#include "CProfiler.h"

CProfiler::CProfiler(void (*func)(void), unsigned int iterations) {
    gettimeofday(&a, 0);
    for (;iterations > 0; iterations --) {
        func();
    }
    gettimeofday(&b, 0);
    result = (b.tv_sec * (unsigned int)1e6 + b.tv_usec) - (a.tv_sec * (unsigned int)1e6 + a.tv_usec);
};

main.cpp

#include "CProfiler.h"

#include <iostream>

class CC {
  protected:
    int width, height, area;
  };

class VCC {
  protected:
    int width, height, area;
  public:
    virtual void set_area () {}
  };

class CS: public CC {
  public:
    void set_area () { area = width * height; }
  };

class VCS: public VCC {
  public:
    void set_area () {  area = width * height; }
  };

void profileNonVirtual() {
    CS *abc = new CS;
    abc->set_area();
    delete abc;
}

void profileVirtual() {
    VCS *abc = new VCS;
    abc->set_area();
    delete abc;
}

int main() {
    int iterations = 5000;
    CProfiler prf2(&profileNonVirtual, iterations);
    CProfiler prf(&profileVirtual, iterations);

    std::cout << prf.result;
    std::cout << "\n";
    std::cout << prf2.result;

    return 0;
}

Сначала я сделал только 100 и 10000 итераций, и результаты вызвали беспокойство: 4 мс для не виртуализированных и 250 мс для виртуализированных! Я почти вошел внутрь, но потом увеличил количество итераций примерно до 500 000; чтобы результаты стали почти полностью идентичными (возможно, на 5% медленнее без включенных флагов оптимизации).

Мой вопрос: почему произошло такое значительное изменение при меньшем количестве итераций по сравнению с большим количеством? Было ли это просто потому, что виртуальные функции были горячими в кеше на таком большом количестве итераций?

Заявление об ограничении ответственности
Я понимаю, что мой код «профилирования» не идеален, но он, как и есть, дает оценку вещей, это все, что имеет значение на этом уровне. Также я задаю эти вопросы для изучения, а не только для оптимизации своего приложения.

7
задан deceleratedcaviar 2 February 2011 в 07:57
поделиться