首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用“大于或等于”或仅使用“大于”

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

Stack Overflow用户
提问于 2008-10-23 19:41:26
回答 8查看 42.7K关注 0票数 13

我记得从C时代起,我们就被鼓励使用

代码语言:javascript
复制
i > -1

而不是

代码语言:javascript
复制
i >= 0

因为它的性能。

这是否仍然适用于C# .NET世界?在当今的编译器中使用一种而不是另一种会带来什么性能上的影响?也就是说,编译器是否足够聪明,可以为你优化这些?

(顺便说一句,在Stack Overflow上的问题栏中输入问题"use >= or >“,看看会发生什么。)

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-10-23 19:44:24

不,没有与比较运算符相关联的性能问题。任何好的编译器都会优化如此琐碎的东西。

我不知道你是从哪里得到建议使用"i > -1“而不是"i >= 0”的。在x86架构上,使用哪种没有区别:任何一种情况都需要两条指令……一个用于比较,一个用于跳跃:

代码语言:javascript
复制
 ;; 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汇编语言表示:

代码语言:javascript
复制
 // 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“实际上会快一条指令。当然,RISC代码是如此可优化,以至于编译器可能会几乎无法识别地更改这两个指令序列:-)

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

票数 47
EN

Stack Overflow用户

发布于 2008-10-23 19:58:39

除了任何优秀的编译器都会做正确的事情,而且在现代架构中,>>=的比较没有速度差异之外,更大的图景是,这是一个“微优化”,在绝大多数情况下不会影响运行时性能。

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

代码语言:javascript
复制
if (length >= str.size())

对比

代码语言:javascript
复制
if (length > str.size() - 1)

我不知道你怎么想,但我随时都会选第一个。:-)在不会明显影响性能的情况下,比如这样,可读性更好的选项应该会胜出。

票数 12
EN

Stack Overflow用户

发布于 2008-10-23 19:57:56

这里有一个非常相似的问题(没有批评意味-正如您所说,搜索符号很棘手):"Should one use < or <= in a for loop"

(是的,我碰巧能够很容易地找到它,因为我的答案得到了很多好评……)

基本上,做任何最具可读性的事情。当有人正确地猜测,改变最易读的形式将解决性能问题(没有分析器的帮助)的那一天,就是我停止谈论性能的那一天:)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/231159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档