Давно мучаюсь вопросом есть ли различия между командами меньше и меньше или равно на низком уровне в плане количества команд и производительности?
То есть на машинном коде меньше или равно это две команды подряд, а меньше одна? Или они обе представляют собой одну команду? Без учета выгрузки из памяти значений и т.п. Просто сами по себе.
Операторы языка С++ и машинные команды - это два разных, никак однозначно не связанных друг с другом мира. Поэтому абстрактно рассуждать о "производительности" операторов языка в терминах команд низкого уровня (т.е. машинных команд) - совершенно бесполезная и бессмысленная задача. Между этими мирами нет никакого однозначного соответствия. Невозможно предсказать, в какие машинные команды будут странслированы операторы < и <= в каждом конкретном контексте кода (даже одним и тем же компилятором, даже с одними и теми же настройками).
Это не говоря уже о том, что во многих популярных машинных архитектурах (читай: наш родной x86) вообще нет монолитных машинных команд, соответствующих встроенным операторам < и <=. Сравнения обычно выливаются в двухэтапную операцию:
И способ формирования флагов состояния процессора, и последующее действие зависят от конкретного кода, использующего < и <=. Например, выставление флагов состояния процессора может быть бесплатным наследием предыдущей машинной операции, формировавшей операнды для сравнения. В такой ситуации первый этап выполнять не надо вообще.
Все условные переходы выполняются единственной командой из семейства команд Jcc. Конкретно по вашему вопросу, переход по "меньше" это команда JL, а по "меньше или равно" - команда JLE. Семейство это большое, даже огромное - несколько десятков команд, но все они выполняются за одно и то же время. Исключением являются несколько команд которые совмещают проверку условия и переход, например JECXZ, которая проверяет содержимое регистра ECX, и выполняет переход если не 0. Эти команды выполняются чуть медленнее, чем обычные условные переходы.
На всякий случай еще скажу, что команды условных переходов (за исключением JCXZ/JECXZ) ничего не анализируют, а просто выполняют или не выполняют переход в зависимости от состояния флагов в регистре флагов. Сами флаги, такие как Zero, Sign, Carryи т.д., устанавливаются предыдущей операцией. Это может быть как операция сравнения, так и например, арифметическая. Например, после команды вычитания SUB можно сразу поставить команду JZ "переход если 0", потому что SUB устанавливает флаги и дополнительной команды сравнения не требуется.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости