Прежде чем вы съежитесь от повторяющегося заголовка, другой вопрос не подходил к тому, что я задаю здесь (ИМО). Итак.
Я действительно хочу использовать виртуальные функции в своем приложении, чтобы упростить работу в сто раз (разве не в этом суть ООП;)). Но я где-то читал, что они приходятся дорого, не видя ничего, кроме той же старой надуманной шумихи о преждевременной оптимизации, я решил быстро покрутить ее в небольшом тесте производительности, используя:
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% медленнее без включенных флагов оптимизации).
Мой вопрос: почему произошло такое значительное изменение при меньшем количестве итераций по сравнению с большим количеством? Было ли это просто потому, что виртуальные функции были горячими в кеше на таком большом количестве итераций?
Заявление об ограничении ответственности
Я понимаю, что мой код «профилирования» не идеален, но он, как и есть, дает оценку вещей, это все, что имеет значение на этом уровне. Также я задаю эти вопросы для изучения, а не только для оптимизации своего приложения.