使用“大于或等于”或仅“大于”

时间:2008-10-23 19:41:26

标签: c# .net c

我记得在C日,我们被鼓励使用

i > -1

而不是

i >= 0

因为表现。

这仍然适用于C#.NET世界吗?在今天的编译器中使用一个与另一个相比有什么性能影响?即编译器是否足够聪明,可以为您优化这些?

(另外尝试在Stack Overflow上的问题字段中输入问题“use> =或>”,看看会发生什么。)

8 个答案:

答案 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)

如果大于零,则必须进行两次检查。它检查负位是否关闭,并检查零位是否关闭。

如果大于或等于零,则只需要检查负位是否关闭,因为我们不关心零位是打开还是关闭。