All
Я пишу некоторый чувствительный к производительности код, в том числе трехмерный векторный класс, который будет выполнять множество перекрестных продуктов. Как давний программист на C ++, я знаю все о пороках макросов и различных преимуществах встроенных функций. У меня давно сложилось впечатление, что встроенные функции должны работать примерно с той же скоростью, что и макросы. Однако, при тестировании производительности макросов против встроенных функций, я обнаружил интересное открытие, которое, я надеюсь, является результатом того, что я где-то допустил глупую ошибку: макроверсия моей функции оказывается в 8 раз быстрее, чем встроенная версия. !
Во-первых, нелепо урезанная версия простого векторного класса:
class Vector3d
{
public:
double m_tX, m_tY, m_tZ;
Vector3d() : m_tX(0), m_tY(0), m_tZ(0) {}
Vector3d(const double &tX, const double &tY, const double &tZ):
m_tX(tX), m_tY(tY), m_tZ(tZ) {}
static inline void CrossAndAssign ( const Vector3d& cV1, const Vector3d& cV2, Vector3d& cV )
{
cV.m_tX = cV1.m_tY * cV2.m_tZ - cV1.m_tZ * cV2.m_tY;
cV.m_tY = cV1.m_tZ * cV2.m_tX - cV1.m_tX * cV2.m_tZ;
cV.m_tZ = cV1.m_tX * cV2.m_tY - cV1.m_tY * cV2.m_tX;
}
#define FastVectorCrossAndAssign(cV1,cV2,cVOut) { \
cVOut.m_tX = cV1.m_tY * cV2.m_tZ - cV1.m_tZ * cV2.m_tY; \
cVOut.m_tY = cV1.m_tZ * cV2.m_tX - cV1.m_tX * cV2.m_tZ; \
cVOut.m_tZ = cV1.m_tX * cV2.m_tY - cV1.m_tY * cV2.m_tX; }
};
Вот мой пример кода тестирования:
Vector3d right;
Vector3d forward(1.0, 2.2, 3.6);
Vector3d up(3.2, 1.4, 23.6);</p>
<pre><code>clock_t start = clock();
for (long l=0; l < 100000000; l++)
{
Vector3d::CrossAndAssign(forward, up, right); // static inline version
}
clock_t end = clock();
std::cout << end - start << endl;
clock_t start2 = clock();
for (long l=0; l<100000000; l++)
{
FastVectorCrossAndAssign(forward, up, right); // macro version
}
clock_t end2 = clock();
std::cout << end2 - start2 << endl;
Конечный результат: при полностью отключенных оптимизациях встроенная версия занимает 3200 тиков, а макро-версия 500 тиков ... С включенной оптимизацией (/ O2, максимизировать скорость и другие настройки скорости) я могу получить встроенная версия до 1100 тиков, что лучше, но все же не то же самое.
Так что я обращаюсь ко всем вам: это правда? Я где-то совершил глупую ошибку? Или встроенные функции действительно намного медленнее - и если да, то почему?