Нет, нет проблем с производительностью, связанных с операторами сравнения. И любой хороший компилятор в любом случае оптимизировал бы что-то такое тривиальное.
Я не уверен, откуда у вас предложение использовать «i> -1» вместо «i> = 0». В архитектуре x86 нет разницы, какую вы используете: в любом случае требуется ровно две инструкции ... одну для сравнения и одну для перехода:
;; if (i > -1) {
cmp eax, -1
jle else
then:
...
else:
;; if (i >= 0) {
cmp eax, 0
jl else
then:
...
else:
На большинстве известных мне RISC-архитектур "i> = 0" может на самом деле быстрее, поскольку обычно есть выделенный нулевой регистр, а "i> -1" может потребовать загрузки константы. Например, MIPS имеет только <инструкцию (нет <=). Вот как две конструкции будут (наивно!) Выражаться на языке ассемблера MIPS: </p>
// if (i >= 0) { (assuming i is in register %t0)
stl $t1, $0, $t0 // in C: t1 = (0 < t0)
beq $t1, $0, else // jump if t1 == 0, that is if t0 >= 0
nop
then:
...
else:
// if (i > -1) { (assuming i is in register %t0)
addi $t2, $0, -1 // in C: t2 = -1
stl $t1, $t2, $t0 // in C: t1 = (t2 < t0) = (-1 < t0)
bne $t1, $0, else // jump if t1 != 0, that is if t0 > -1
nop
then:
...
else:
Таким образом, в наивном общем случае фактически будет на одну команду быстрее выполнять «i> = 0» в MIPS. Конечно, код RISC настолько сильно оптимизируется, что компилятор может изменить любую из этих последовательностей команд почти до неузнаваемости: -)
Итак ... краткий ответ: нет, нет, нет разницы.