Производительность команд < и <=

82
20 августа 2019, 07:20

Давно мучаюсь вопросом есть ли различия между командами меньше и меньше или равно на низком уровне в плане количества команд и производительности?

То есть на машинном коде меньше или равно это две команды подряд, а меньше одна? Или они обе представляют собой одну команду? Без учета выгрузки из памяти значений и т.п. Просто сами по себе.

Answer 1

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

Это не говоря уже о том, что во многих популярных машинных архитектурах (читай: наш родной x86) вообще нет монолитных машинных команд, соответствующих встроенным операторам < и <=. Сравнения обычно выливаются в двухэтапную операцию:

  1. Выставление флагов состояния процессора на основе сравнения операндов
  2. Конкретное действие, зависящее от этих флагов (условный переход, формирование булевского значения, и т.п.)

И способ формирования флагов состояния процессора, и последующее действие зависят от конкретного кода, использующего < и <=. Например, выставление флагов состояния процессора может быть бесплатным наследием предыдущей машинной операции, формировавшей операнды для сравнения. В такой ситуации первый этап выполнять не надо вообще.

Answer 2

Все условные переходы выполняются единственной командой из семейства команд Jcc. Конкретно по вашему вопросу, переход по "меньше" это команда JL, а по "меньше или равно" - команда JLE. Семейство это большое, даже огромное - несколько десятков команд, но все они выполняются за одно и то же время. Исключением являются несколько команд которые совмещают проверку условия и переход, например JECXZ, которая проверяет содержимое регистра ECX, и выполняет переход если не 0. Эти команды выполняются чуть медленнее, чем обычные условные переходы.

На всякий случай еще скажу, что команды условных переходов (за исключением JCXZ/JECXZ) ничего не анализируют, а просто выполняют или не выполняют переход в зависимости от состояния флагов в регистре флагов. Сами флаги, такие как Zero, Sign, Carryи т.д., устанавливаются предыдущей операцией. Это может быть как операция сравнения, так и например, арифметическая. Например, после команды вычитания SUB можно сразу поставить команду JZ "переход если 0", потому что SUB устанавливает флаги и дополнительной команды сравнения не требуется.

READ ALSO
В чем разница типов BOOL и bool?

В чем разница типов BOOL и bool?

В чём разница типов BOOL и bool?

98
Как можно развернуть данную рекурсию?

Как можно развернуть данную рекурсию?

Задача в том, чтобы быстро находить n-тый член последовательности Голомба

107
Как получить папку из ресурсов

Как получить папку из ресурсов

Spring Boot приложениеВызываю в нем командную строку:

120