На современных современных процессорах есть ли разница в производительности между сравнением больше и больше или равно для условия ветвления? Если у меня есть состояние, которое с таким же успехом может быть и тем, и другим, есть ли небольшое преимущество в выборе >
вместо >=
или наоборот? (Это будет для скомпилированного языка на оборудовании Intel или AMD)
Есть ли разница в производительности между больше и больше или равно?
Ответы (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 часто быстрее.
Я не совсем уверен, как базовая реализация выполняется в ALU/FPU, но для всех них должна быть только одна операция (для примитивных типов)
Я действительно надеюсь, что это вопрос только потому, что вам любопытно, а не потому, что вы пытаетесь оптимизировать, это никогда не даст вам большого прироста производительности, и, скорее всего, ваш код будет содержать гораздо худшую производительность. вопросы.
Вы можете реализовать все операторы отношения, используя только один:
a < b is the base a > b == b < a a >= b == !(a < b) a <= b == !(a > b)
Это, конечно, не так, как это реализовано в процессоре, это больше мелочи.
Сильно сомневаюсь, что есть разница.