使用"大于或等于"或仅"大于"

Guy*_*Guy 13 .net c c#

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

i > -1
Run Code Online (Sandbox Code Playgroud)

代替

i >= 0
Run Code Online (Sandbox Code Playgroud)

因为表现.

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

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

Dan*_*ski 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:
Run Code Online (Sandbox Code Playgroud)

在我所知道的大多数RISC架构中,"i> = 0"实际上可能更快,因为通常存在专用的零寄存器,并且"i> -1"可能需要加载常量.例如,MIPS只有<instruction(no <=).以下是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:
Run Code Online (Sandbox Code Playgroud)

因此,在天真的一般情况下,在MIPS上执行"i> = 0"实际上会更快一条指令.当然,RISC代码可以大大优化,以至于编译器可能会更改这些指令序列中的任何一个几乎无法识别:-)

所以...简短的回答是不,不,没有区别.

  • `(不不不,没有区别)=!(!(!(!差异)))=!(!差异))=差异`;) (5认同)

Chr*_*ung 12

除了事实上任何体面的编译器做正确的事情,除了在现代架构中没有速度差异>>=比较之间的事实,更大的图片说这是一个不影响运行时的"微优化"在绝大多数情况下表现.

在比较的情况下,无论以何种方式编写,它通常都不会影响可读性,但有时候选择一个边界比另一个边界更清晰:例如,

if (length >= str.size())
Run Code Online (Sandbox Code Playgroud)

if (length > str.size() - 1)
Run Code Online (Sandbox Code Playgroud)

我不了解你,但我会随时选择选项1.:-)如果没有明显影响性能的情况,例如这个,那么更可读的选项应该会赢.


Jon*_*eet 9

有一个非常相似的问题(没有批评暗示 - 正如你所说,搜索符号很棘手)这里:"应该使用<还是<=for for循环"

(是的,我碰巧能够轻松找到它,因为我的答案有很多赞成......)

基本上,做任何最可读的事情.有人正确猜测,从最易读的形式做出改变的那一天将解决性能问题(没有探查器的帮助)是我停止谈论性能的那一天:)


Epa*_*aga 5

不,你不需要再这样做了.是的,编译器变得更加智能,两个表达式没有性能差异.