我还记得从C语言时代开始,我们被鼓励使用
i > -1
取代
i >= 0
因为性能问题。
在C# .NET世界中是否仍然适用?在当前编译器下使用它们之一会有什么性能影响?也就是说,编译器是否足够聪明,可以为您进行优化?
(另外,请尝试在 Stack Overflow 的问题字段中输入“使用>=还是>”并查看发生了什么。)
没有与比较运算符相关的性能问题。任何好的编译器都会优化这件微不足道的事情。
我不确定你从哪里得到使用"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汇编语言中的(天真地!)表示方式:
// 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:
因此,在天真的普遍情况下,在MIPS上执行"i >= 0"实际上会比执行"i < size"快一个指令。当然,RISC代码非常可优化,编译器很可能会将任一这些指令序列改变到几乎无法识别的程度 :-)
所以...简短的答案是不不不,没有区别。
除了任何体面的编译器都会做正确的事情,以及在现代架构中>
和>=
比较没有速度差异之外,更重要的是这是一种“微优化”,在绝大多数情况下不会影响运行时性能。
在比较方面,通常无论你如何写都不会影响可读性,但有时选择一个边界比另一个更清晰明了,例如:
if (length >= str.size())
对比
if (length > str.size() - 1)
我不知道你怎么想,但我每天都会选择选项1。:-) 在不会明显影响性能的情况下,可读性更好的选项应该获胜。
<
还是<=
”
(是的,我碰巧很容易找到它,因为我的答案得到了很多赞同...)现在你不需要这样做了。是的,编译器变得更加智能化,这两个表达式没有性能差异。
我还记得在C语言时代,我们被鼓励使用“>=”来提高性能。
你确定吗?我从70年代初开始就接触计算机(是的,在我父亲的膝盖上...),我从来没有见过不能像“>”一样快速处理“>=”的CPU。(在IBM360中,“BH”代表“分支高”,“BNL”代表“分支不低”)。
这可能对于一些不太正规的脚本语言是正确的,因为它们将“>=”拆分为两个比较操作,但是如果有人鼓励你在C中使用这种方式……那么你应该尽力忘记他们告诉你的一切。
对于大于零的情况,必须进行两项检查。它会检查负数位是否关闭,并检查零位是否关闭。
对于大于或等于零的情况,只需检查负数位是否关闭,因为我们不关心零位是否开启或关闭。