Есть ли разница в производительности между большим и равным или большим?
Есть ли на современных современных процессорах разница в производительности между сравнением больше или больше или равно для условия ветвления? Если у меня есть условие, которое может быть так же легко, есть ли небольшое преимущество в выборе >
над >=
или наоборот? (Это будет для скомпилированного языка на оборудовании Intel или AMD)
3 ответа
Между сравнением разных предикатов не должно быть заметных различий из-за способа их вычисления (будьте осторожны, я не читал руководства по x86 подробно, поэтому он может работать по-разному):
Большинство инструкций производят несколько флагов как побочный продукт, обычно у вас есть по крайней мере: carry (c), overflow (o), ноль (z) и минус (n).
Используя те предикаты, которые созданы инструкцией xy (которая надежно создает вышеупомянутые 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
Я не совсем уверен, как осуществляется базовая реализация в ALU/FPU, но для всех из них должна быть только одна операция (для примитивных типов)
Я действительно надеюсь, что это только вопрос, потому что вам любопытно, а не то, что вы пытаетесь оптимизировать, это никогда не даст вам большого прироста производительности, и, скорее всего, ваш код будет содержать гораздо худшие проблемы с производительностью.
Вы можете реализовать все операторы отношений, используя только один:
а <б является основой a> b == b = b ==!(a b)
Это, конечно, не так, как это реализовано в процессоре, это более мелочи.