我记得在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代码可以大大优化,以至于编译器可能会更改这些指令序列中的任何一个几乎无法识别:-)
所以...简短的回答是不,不,没有区别.
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.:-)如果没有明显影响性能的情况,例如这个,那么更可读的选项应该会赢.
有一个非常相似的问题(没有批评暗示 - 正如你所说,搜索符号很棘手)这里:"应该使用<还是<=for for循环"
(是的,我碰巧能够轻松找到它,因为我的答案有很多赞成......)
基本上,做任何最可读的事情.有人正确猜测,从最易读的形式做出改变的那一天将解决性能问题(没有探查器的帮助)是我停止谈论性能的那一天:)