Есть ли разница в скорости в «если», функционирующем для удобства чтения в C ++?

c++ performance function if-statement

77 просмотра

1 ответ

Например.

bool IsPlayerOutMap()
{
    bool t = (Player.x < 0 || Player.y < 0
        || Player.x > 1000 || Player.y > 1000);
    return t;
}

if(IsPlayerOutMap())
    cnt++;

а также

if((Player.x < 0 || Player.y < 0
        || Player.x > 1000 || Player.y > 1000))
    cnt++;

Есть ли разница в скорости в двух стилях кодирования?

Автор: jong-hyeon-yeo Источник Размещён: 08.11.2019 10:58

Ответы (1)


1 плюс

Решение

в основном за провал "если" у вас есть снижение производительности. поскольку в процессоре есть каналы выполнения (он начинает выполнять следующие asm-команды до того, как закончился предыдущий), когда вы вводите «if», прогноз ветвления CPU (вы можете прочитать об этом) выбрал выполнение одного из путей (результат if равен « true "или" false ") и если это не так, то exec останавливается посередине (заменяет команды на NOP - без операций) и начинает другой путь, здесь вы теряете производительность.

в вашем коде код «if» и логическое выражение более или менее равны (вы можете прочитать о «if shortcut», чтобы понять почему). однако здесь может иметь значение вызов другой функции. в отличие от того, что было сказано в комментариях, компилятор не всегда помещает его в строку (если вы не укажете с помощью флагов), и даже в некоторых случаях встроенный код становится длиннее, и тогда вы можете получить больше кэш-памяти (вы можете прочитать об этом) в кеш инструкций.

это микрооптимизация, как сказано, и лучший способ решить это с помощью профилировщика. Такая небольшая оптимизация, по моему опыту, имеет значение только в очень специфических случаях, например, маршрутизатор, который обрабатывает 10M пакетов в секунду, а не каждый нано.

другой момент. это лучший стиль кода, чтобы всегда добавлять фигурные скобки вокруг кода «если». это не влияет на производительность.

Автор: roni Размещён: 20.08.2016 08:20
Вопросы из категории :
32x32