Страницы

Поиск по вопросам

пятница, 11 января 2019 г.

Функция нахождения максимума

Почему функция
int max1(int x,int y) { return x>y ? x : y; }
работает медленнее, чем
int max2(int x,int y) { return x?
Вот нашёл статью про это даже (в конце таблицы сравнения скоростей)
Вот моё сравнение:
#include #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; }


Ответ

Я как раз недавно рассматривал подобный вопрос в этой статье (в самом конце).
У меня получилось так, что на архитектуре x86 всё зависит от порядка сравнения. Если x сравнивается с y, то компилятор даёт одну последовательность команд, а если наоборот, то другую последовательность тех же самых команд. Причина разницы в скорости, видимо, в особенностях микроархитектуры. Одна последовательность команд, видимо, лучше ложится на конвейер или ещё какие-то сторонние факторы влияют.
Это общая беда, наверное, всех процессоров Intel. Аналогично, я заметил, что команда inc eax будет работать медленнее, чем lea eax, [eax+1]. Подобных приколов, наверное, ещё много.

Комментариев нет:

Отправить комментарий