Есть ли разница в производительности между больше и больше или равно?

На современных современных процессорах есть ли разница в производительности между сравнением больше и больше или равно для условия ветвления? Если у меня есть состояние, которое с таким же успехом может быть и тем, и другим, есть ли небольшое преимущество в выборе > вместо >= или наоборот? (Это будет для скомпилированного языка на оборудовании Intel или AMD)


person WilliamKF    schedule 30.05.2011    source источник
comment
Сомневаюсь, а если бы и было, то было бы примерно как кошачий ус.   -  person Mike Dunlavey    schedule 30.05.2011
comment
Эта статья полезна tosbourn.com/less-than-vs -меньше или равно   -  person Ryan Walker    schedule 08.10.2019


Ответы (3)


Не должно быть заметной разницы между сравнением разных предикатов из-за того, как они вычисляются (будьте осторожны, я не читал подробно руководства по x86, поэтому они могут работать по-разному):

Большинство инструкций создают несколько флагов в качестве побочного продукта, обычно у вас есть по крайней мере: перенос (c), переполнение (o), нуль (z) и отрицательный (n).

Используя те предикаты, которые создаются инструкцией x-y (которая надежно создает вышеупомянутые 4), мы можем легко вычислить все желаемые сравнения тривиально. Для беззнаковых чисел:

x = y    z
x != y   !z
x < y    !c
x <= y   !c + z
x > y    c . !z
x >= y   c

Так что вряд ли это имеет какое-то значение. Но есть и некоторые различия, которые в основном сводятся к тому, можем ли мы использовать ПРОВЕРКУ (которая представляет собой И вместо полноценного вычитания) или должны использовать СМР (это вычитание). TEST более ограничен, но быстрее (обычно).

Кроме того, современные архитектуры (начиная с c2d на стороне Intel) иногда могут объединять две микрооперации в одну макрооперацию — так называемое слияние макроопераций, которое имеет некоторые приятные преимущества. И правила для этого меняются от одной архитектуры к другой и немного длиннее. Например, ветки, которые проверяют только флаг переполнения, четности или знака (JO, JNO, JP, JNP, JS, JNS), могут объединяться с TEST, но не с CMP на c2d и nehalems (можно поспорить, что я просмотрел это - раздел 7.5).

Так можем ли мы просто сказать, что это сложно, и не беспокоиться о таких вещах? Это за исключением случаев, когда вы пишете оптимизатор для компилятора, потому что на самом деле - независимо от того, ЧТО вы пишете в своем исходном коде, компилятор все равно будет делать то, что он хочет - и по уважительной причине (т. Е. Если бы JGE теоретически был быстрее, у вас было бы писать if (x ‹ y) обычно..). И если вам действительно нужен один совет: сравнение с 0 часто быстрее.

person Voo    schedule 30.05.2011

Я не совсем уверен, как базовая реализация выполняется в ALU/FPU, но для всех них должна быть только одна операция (для примитивных типов)

Я действительно надеюсь, что это вопрос только потому, что вам любопытно, а не потому, что вы пытаетесь оптимизировать, это никогда не даст вам большого прироста производительности, и, скорее всего, ваш код будет содержать гораздо худшую производительность. вопросы.

Вы можете реализовать все операторы отношения, используя только один:

a < b is the base
a > b == b < a
a >= b == !(a < b)
a <= b == !(a > b)

Это, конечно, не так, как это реализовано в процессоре, это больше мелочи.

person Nicklas A.    schedule 30.05.2011

Сильно сомневаюсь, что есть разница.

person MRAB    schedule 30.05.2011
comment
Я куплю этот. Правильно и по делу. Я тоже искренне верю, что разницы нет. - person Manny Alvarado; 13.05.2020