-1 代替 i >= 0 因为性能。 这是否仍然适用于 C# .NET 世界?在当今的编译器中使用其中一种对性能有何影响?即编译器是否足够聪明,可以为您优化-6ren">
gpt4 book ai didi

c# - 使用 "greater than or equals"或仅使用 "greater than"

转载 作者:可可西里 更新时间:2023-11-01 07:59:25 27 4
gpt4 key购买 nike

我记得从 C 天起我们就被鼓励使用

i > -1

代替

i >= 0

因为性能。

这是否仍然适用于 C# .NET 世界?在当今的编译器中使用其中一种对性能有何影响?即编译器是否足够聪明,可以为您优化这些?

(顺便说一句,尝试在 Stack Overflow 的问题字段中输入问题“use >= or >”,看看会发生什么。)

最佳答案

不,没有与比较运算符相关的性能问题。无论如何,任何好的编译器都会优化这种微不足道的东西。

我不确定您从哪里得到使用“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 代码的优化程度如此之高,以至于编译器可能会将这些指令序列中的任何一个更改得几乎无法识别:-)

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

关于c# - 使用 "greater than or equals"或仅使用 "greater than",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/231159/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com