#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 генерируют различные инструкции условного перемещения, но их отличие лишь в инструкции сравнения(меньше и больше-равно), что в цифровой логике реализуется одинаково, поэтому разницы никакой не будет. (*) Разница в производительности может быть только в следующих случаях: Неправильные измерения Ошибка компилятора
Комментариев нет:
Отправить комментарий