Есть ли разница в производительности между больше и больше или равно? - PullRequest
9 голосов
/ 30 мая 2011

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

Ответы [ 3 ]

6 голосов
/ 30 мая 2011

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

Большинство инструкций производят несколько флагов в качестве побочного продукта, обычно у вас есть по крайней мере: carry (c), overflow (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 (который является AND вместо полного вычитания) или использовать CMP (это вычитание). ТЕСТ более ограничен, но быстрее (обычно).

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

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

4 голосов
/ 30 мая 2011

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

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

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

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

Это, конечно, не то, как это реализовано в ЦП, это более мелочи.

0 голосов
/ 30 мая 2011

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

...