我记得在C日,我们被鼓励使用
i > -1
而不是
i >= 0
因为表现。
这仍然适用于C#.NET世界吗?在今天的编译器中使用一个与另一个相比有什么性能影响?即编译器是否足够聪明,可以为您优化这些?
(另外尝试在Stack Overflow上的问题字段中输入问题“use> =或>”,看看会发生什么。)
答案 0 :(得分:46)
不,没有与比较运算符相关的性能问题。任何好的编译器都会优化这个微不足道的东西。
我不确定你在哪里建议使用“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&gt; = 0”实际上会更快一条指令。当然,RISC代码非常优化,以至于编译器可能会更改这些指令序列中的任何一个几乎无法识别: - )
所以......简短的回答是不,不,没有区别。
答案 1 :(得分:12)
除了任何体面的编译器做正确的事情之外,除了在现代架构中>
和>=
比较之间没有速度差异的事实之外,更大的图片说这个是一种“微优化”,在绝大多数情况下都不会影响运行时性能。
在比较的情况下,它通常不会影响你的可读性,但有时候选择一个边界比另一个边界更清晰:例如,
if (length >= str.size())
与
if (length > str.size() - 1)
我不了解你,但我会在任何一天选择选项1。 :-)如果没有明显影响性能的情况,例如,那么更可读的选项应该获胜。
答案 2 :(得分:9)
有一个非常相似的问题(没有批评暗示 - 如你所说,搜索符号很棘手):"Should one use <
or <=
in a for loop"
(是的,我碰巧能够轻松找到它,因为我的答案有很多赞成......)
基本上,做任何最可读的事情。有人正确猜测,从最易读的形式做出改变的那一天将解决性能问题(没有探查器的帮助)是我停止谈论性能的那一天:)
答案 3 :(得分:5)
不,你不需要再这样做了。是的,编译器变得更加智能,两个表达式没有性能差异。
答案 4 :(得分:3)
我记得从C日起我们被鼓励使用....因为表现。
你肯定有关吗?我曾经使用电脑回到70年代早期(是的,在我父亲的膝盖上......),我从来没有见过无法处理的CPU&gt; =和&gt;一样快。 (BH“Branch High”与BNL“Branch not Low”在IBM360谈话中)。
答案 5 :(得分:2)
对于一些将&gt; =分解成2个比较的阴影脚本语言可能是真的,但是无论谁鼓励你将它用于C ......嗯......你应该尽力忘记他们曾经做过的一切告诉你。
答案 6 :(得分:2)
这让我想起了使用++ i代替i ++(pre-increment与post-increment)的建议,因为它假设一条指令更快。 (我忘记了我最初读到这里的内容,但它可能是C / C ++用户期刊或Dobb博士的期刊,但我似乎找不到网络参考。)
我严重怀疑&gt;或&gt; =更快或更慢;而是为了清晰起见而编写代码。
作为旁注,我开发了对预增量(++ i)运算符的偏好,即使原因现在可能过时了。
答案 7 :(得分:-1)
如果大于零,则必须进行两次检查。它检查负位是否关闭,并检查零位是否关闭。
如果大于或等于零,则只需要检查负位是否关闭,因为我们不关心零位是打开还是关闭。