Все,C++/VS2008: Выполнение макросов против функций Инлайн
Я пишу некоторые производительности чувствительную кода, в том числе 3D-вектор класса, который будет делать много перекрестных продуктов. Являясь давним программистом на 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);
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 тиков, что лучше, но все же не t он такой же.
Итак, я призываю всех вас: это действительно так? Я где-то совершил глупую ошибку? Или встроенные функции действительно намного медленнее - и если да, то почему?
Да, изменения кода и не проверяя, что она производит тот же результат, мать глупых ошибок. –
Вопрос: вы действительно выполнили тесты с включенными оптимизациями? Для компиляторов принято не включать все в отладку, потому что встроенная функция не отображается в стеке, что затрудняет отладку. –
«Когда оптимизация полностью отключена, встроенная версия занимает [больше]». Ну, что вы ожидаете, когда выключаете вставку? – sbi