在C++中,i>-1和i>=0哪个更好?

10

这可能是一个愚蠢的问题,但是这种优化有时可以提高应用程序的性能。

我具体地问C ++,因为C ++编译代码的方式与c#或Java有很大的不同。

问题是,如果变量i是int,哪个表现更好。

  1. i > -1
  2. i >= 0

我在寻找两个条件所需要的内存块或寄存器以及CPU周期方面的性能。

提前感谢。


生成的汇编代码几乎相同。我认为这里没有任何区别。 - anishsane
4
看看这个 - shauryachats
7
微观优化是万恶之源。 - AK_
1
很大程度上取决于指令集。有些指令集针对零测试具有特殊指令。 - cup
请查看以下链接:https://dev59.com/XGUq5IYBdhLWcg3waPtC - Drax
显示剩余3条评论
3个回答

16
在汇编语言中,两者都在同一结构中:
  1. i > -1

    cmp   [register with i value],-1
    jg    [somewhere]
    
  2. i >= 0

  3. cmp   [register with i value],0
    jge   [somewhere]
    
    根据使用跳转标志,指令jg进行两个标志比较(ZF = 0且SF = OF),而jge只进行一个比较(SF = OF)。
    所以我倾向于认为两者使用的寄存器和CPU周期几乎相同,也许对于i >= 0有非常轻微的比较更快。

即使进行两次标志比较而不是一次,所需的周期数也是相同的,对吗? - RSinohara
@RSinohara 我不这么认为。拿编程代码中的同样示例来说:if (something)if (something && something_else)之间哪个更慢? - Aracthor
加载立即值-1可能更昂贵或需要更多字节。不清楚JIT是否将一种形式优化为另一种形式。 - usr
@usr 不是的。看一下这个链接:http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf 在附录C的延迟/吞吐量表中,每个jcc(条件跳转)都被分组在一起。 - RSinohara
@RSinohara,我说的是加载常量-1,而不是跳转。显然,所有的跳转和比较都有相同的成本(微不足道的成本)。 - usr
-1和0在机器代码中都占用一个字节。该字节从内存中完整读取,需要相同的时间(相同的指令)。如果与>255进行比较,则需要更长的时间。 - RSinohara

2

根据逻辑,>操作可能比>=操作“更便宜”,但我猜您启用了优化选项进行编译,所以编译器可能会对您的代码进行优化,因此我认为这并不重要,即使其中一个真正更快,编译器也可能将其更改为最佳选项。


0

在编写for循环时,将其从for (i = 0; i < 1000; i++)转换为for (i = 1000; i > 0; i--)可能会有益处,因为在某些体系结构上,当i达到0时,编译器可以跳过比较指令,因为一个标志位将被设置。在现代体系结构中,我不确定这是否重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接