我记得从C时代起,我们就被鼓励使用
i > -1而不是
i >= 0因为它的性能。
这是否仍然适用于C# .NET世界?在当今的编译器中使用一种而不是另一种会带来什么性能上的影响?也就是说,编译器是否足够聪明,可以为你优化这些?
(顺便说一句,在Stack Overflow上的问题栏中输入问题"use >= or >“,看看会发生什么。)
发布于 2008-10-23 19:44:24
不,没有与比较运算符相关联的性能问题。任何好的编译器都会优化如此琐碎的东西。
我不知道你是从哪里得到建议使用"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“实际上会快一条指令。当然,RISC代码是如此可优化,以至于编译器可能会几乎无法识别地更改这两个指令序列:-)
所以..。简短的答案是不,没有区别。
发布于 2008-10-23 19:58:39
除了任何优秀的编译器都会做正确的事情,而且在现代架构中,>和>=的比较没有速度差异之外,更大的图景是,这是一个“微优化”,在绝大多数情况下不会影响运行时性能。
在比较的情况下,它通常不会影响可读性,无论你写它的方式,但有时选择一个边界比另一个更清晰:例如,
if (length >= str.size())对比
if (length > str.size() - 1)我不知道你怎么想,但我随时都会选第一个。:-)在不会明显影响性能的情况下,比如这样,可读性更好的选项应该会胜出。
发布于 2008-10-23 19:57:56
这里有一个非常相似的问题(没有批评意味-正如您所说,搜索符号很棘手):"Should one use < or <= in a for loop"
(是的,我碰巧能够很容易地找到它,因为我的答案得到了很多好评……)
基本上,做任何最具可读性的事情。当有人正确地猜测,改变最易读的形式将解决性能问题(没有分析器的帮助)的那一天,就是我停止谈论性能的那一天:)
https://stackoverflow.com/questions/231159
复制相似问题