Страницы

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

четверг, 2 января 2020 г.

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

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

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

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