Anomaex
@Anomaex

Как понять операторы сравнения на конкретном примере?

Здравствуйте, подскажите, как понять операторы сравнения в таком примере:

if (current_distance <= attack_distance)
    start_attack = true;

или

if (current_distance > attack_distance)
{ }
else
    start_attack = true;


По сути это одно и то же, но например в первом варианте мы сравниваем переменные и делаем две операции сравнения, а во втором как одна.
Влияет это на производительность, например если возьмем скажем 1 миллион циклов в for и сравним две записи?
Как происходит это на уровне процессора?
  • Вопрос задан
  • 158 просмотров
Решения вопроса 1
gbg
@gbg
Любые ответы на любые вопросы
Эм. У x86, бати нынешних десктопов, эти сравнения делаются за одну инструкцию CMP, а потом парсилкой регистра флагов тпа JEQ, JZ, JLE, выбирается, куда прыгать. Так что одинаково оно будет на деле.

Но! Современные компиляторы и процессоры гораздо более умны, чем вы хотите. Поэтому, если вы собираетесь написать что-то быстрое, придерживайтесь определенных рекомендаций типа "располагайте данные в памяти линейно (так предиктор кэша выборки работает лучше)" и "избегайте ветвлений (так меньше будет срывов конвейера)". Это лучше гаданий "во что откомпилируется мой код".

Подлинно горячие места компилируют на C++/C/Rust с контролем полученного ассемблерного кода, но до этого, как правило, вылизывают алгоритм, потому что O(log n) и O(n^3) - две большие разницы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
GavriKos
@GavriKos
Юнити тут причем?

Если вас так волнует перфоманс ТАКОГО уровня - то вам надо смотреть как это дело развернется в ассемблер. Потому что все намного сложнее чем 1 или 2 операции сравнения.
Кстати в упор не пойму где их две... В первом варианте тоже одна операция сравнения.
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
На уровне процессора это не происходит, потому что идет компиляция данного кода в бинарные инструкции процессора, и нужно уже смотреть как именно пройдет компиляция.
В отрыве от контекста, предсказать сложно, так как может зависеть от размера программы, например, поместится ли в страницу памяти условие и блок с командами, которые нужно выполнить по условию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы