使用“;大于或等于“;或者仅仅是“;大于“;
本文关键字:大于 或者 仅仅是 使用 | 更新日期: 2023-09-27 17:48:53
我记得在C时代,我们被鼓励使用
i > -1
而不是
i >= 0
因为性能。
这仍然适用于C#世界吗?在当今的编译器中使用一个编译器而不是另一个编译器会对性能产生什么影响?即编译器是否足够聪明,可以为您优化这些?
(顺便试着在Stack Overflow的问题字段中键入问题"use>=或>",看看会发生什么。)
否,不存在与比较运算符相关的性能问题。任何一个好的编译器都会优化这种琐碎的东西。
我不知道你从哪里得到了使用"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仅具有<指令(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:
因此,在天真的一般情况下,在MIPS上执行"i>=0"实际上会快一条指令。当然,RISC代码是如此的可优化,以至于编译器可能会改变这些指令序列中的任何一个,几乎无法识别:-)
所以。。。简短的回答是不不不,没有区别。
除了任何优秀的编译器都能做正确的事情,而且在现代体系结构中,>
和>=
之间的比较没有速度差异之外,更大的情况是,这是一种"微优化",在绝大多数情况下不会影响运行时性能。
在比较的情况下,无论你用哪种方式写,它通常都不会影响可读性,但有时选择一个边界比另一个边界更清晰:例如,
if (length >= str.size())
与
if (length > str.size() - 1)
我不知道你的情况,但我随时都会选择选项1在不会明显影响性能的情况下,比如这样,可读性更强的选项应该会胜出。
这里有一个非常相似的问题(没有批评意味——正如你所说,搜索符号很棘手):"应该在for循环中使用<
或<=
吗?"
(是的,我碰巧能很容易地找到它,因为我的答案有很多赞成票…)
基本上,做最可读的事情。有人正确地猜测,在没有探查器帮助的情况下,从最可读的形式进行更改将解决性能问题的那一天,我就不再谈论性能了:)
不,您不需要再这样做了。是的,编译器变得更加智能,并且这两个表达式的性能没有任何差异。
我记得在C时代,我们被鼓励使用。。。。因为性能。
你确定吗?我使用的计算机可以追溯到70年代初(是的,在我父亲的膝盖上…),我从未见过CPU不能像>那样快速处理>=。(在IBM360谈话中,BH"Branch High"vs.BNL"Branch Not Low")。
对于一些将a>=分解为2个比较的可疑脚本语言来说,这可能是真的,但无论是谁鼓励你将其用于C…嗯。。。你可能应该努力忘记他们告诉你的一切。
这让我想起了使用++i而不是i++(增量前与增量后)的建议,因为它比更快一条指令。(我忘了我最初在哪里读到这篇文章,但它可能是《C/C++用户杂志》或《多布博士杂志》,但我似乎找不到网络参考资料。)
我很怀疑>或>=是快还是慢;相反,为了清晰起见,编写代码。
顺便说一句,我倾向于使用预增量(++I)运算符,即使原因现在可能已经过时了。
对于大于零,它必须进行两次检查。它检查负位是否关闭,检查零位是否关闭。
对于大于或等于零,它只需要检查负位是否关闭,因为我们不在乎零位是打开还是关闭。