#cpp
Почему функция int max1(int x,int y) { return x>y ? x : y; } работает медленнее, чем int max2(int x,int y) { return x#include #include #include #include #include int max1(int x,int y) { return x>y ? x : y; } int max2(int x,int y) { return x > v(size); std::for_each(v.begin(),v.end(),[](std::pair & x){x=std::make_pair(std::rand(),std::rand());}); unsigned int start1 = clock(); for (auto i : v) max1(i.first,i.second); unsigned int end1 = clock(); std::cout << end1-start1 << std::endl; unsigned int start2 = clock(); for (auto i : v) max2(i.first,i.second); unsigned int end2 = clock(); std::cout << end2-start2 << std::endl; }
Ответы
Ответ 1
Я как раз недавно рассматривал подобный вопрос в этой статье (в самом конце). У меня получилось так, что на архитектуре x86 всё зависит от порядка сравнения. Если x сравнивается с y, то компилятор даёт одну последовательность команд, а если наоборот, то другую последовательность тех же самых команд. Причина разницы в скорости, видимо, в особенностях микроархитектуры. Одна последовательность команд, видимо, лучше ложится на конвейер или ещё какие-то сторонние факторы влияют. Это общая беда, наверное, всех процессоров Intel. Аналогично, я заметил, что команда inc eax будет работать медленнее, чем lea eax, [eax+1]. Подобных приколов, наверное, ещё много.Ответ 2
Разницы в производительности вышеприведённых функций нет и быть её не может(*). Они могут быть преобразованы в абсолютно идентичный ассемблерный код, что и делает, к примеру, gcc. clang и MSVC генерируют различные инструкции условного перемещения, но их отличие лишь в инструкции сравнения(меньше и больше-равно), что в цифровой логике реализуется одинаково, поэтому разницы никакой не будет. (*) Разница в производительности может быть только в следующих случаях: Неправильные измерения Ошибка компилятора
Комментариев нет:
Отправить комментарий