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