Сравнение в цикле (оптимизация) - PullRequest
0 голосов
/ 01 сентября 2018

Рассмотрим ситуацию:

bool b = checking_some_condition();

for (int i = 0; i < 1000000; ++i)
{
    if (b)
           do_something(i);
    else 
           do_something_else(i);
}

Очевидно ли, что компилятор оптимизирует приведенный выше код примерно так? :

if (b)
{
    for (int i = 0; i < 1000000; ++i)
        do_something(i);
}
else
{
    for (int i = 0; i < 1000000; ++i)
        do_something_else(i);
}

Конечно, я только привожу пример нынешней ситуации. Я знаю, что проверка значения bool 1000000 раз вряд ли заметна для производительности, но если бы у меня были более сложные сравнения с несколькими способами того, как будет происходить код внутри цикла, изменение производительности может быть значительным. Особенно, если этот код будет внутри функции, которая вызывается несколько раз.

1 Ответ

0 голосов
/ 01 сентября 2018

Как уже упоминалось в комментариях выше, вы не можете сделать безопасное предположение, что компилятор оптимизирует или не оптимизирует. Это их "свобода" делать это или нет.

Если вы хотите понять, что происходит, лучше всего посмотреть на сгенерированную сборку, которая даст вам объективный способ аргументировать, что, возможно, сделал компилятор. https://godbolt.org/z/W-5Hve показывает простой пример, который вы разместили выше.

Однако, пожалуйста, попробуйте сделать пример в Godbolt как можно более реалистичным, а затем проверьте сборку. Даже если два фрагмента дадут одну и ту же сборку в godbolt, чтобы убедиться, что это также произойдет в вашей кодовой базе, вам также необходимо проверить сборку вашей скомпилированной реализации в вашей кодовой базе.

Подводя итог, я обычно делаю следующее:
- попробуйте реалистичный пример в Godbolt, поиграйте с разными компиляторами / флагами и меняйте код, пока я не пойму, что происходит.
- скомпилируйте мой проект и посмотрите на сборку, чтобы попытаться снова найти конкретную функцию, чтобы убедиться, что результат в моей кодовой базе совпадает.

В качестве небольшого дополнения: objdump -M intel -dC executable покажет вам сборку исполняемого файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...