【问题标题】:In C++, which is better i>-1 or i>=0 [duplicate]在 C++ 中,哪个更好 i>-1 或 i>=0 [重复]
【发布时间】:2015-08-04 08:55:25
【问题描述】:

这可能是一个愚蠢的问题,但这种优化有时会提高应用程序的性能。 这里我特意问的是C++,因为C++编译代码的方式和c#或者Java有很大的不同。

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

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

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

提前致谢。

【问题讨论】:

  • 生成的汇编代码几乎相同。我认为这里没有任何区别。
  • 签出this
  • 微优化是万恶之源。
  • 很大程度上取决于指令集。有些有针对零测试的特殊说明。

标签: c++ optimization premature-optimization


【解决方案1】:

在汇编语言中,两者的结构相同:

  1. i > -1

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

    cmp   [register with i value],0
    jge   [somewhere]
    

根据used jump flags,指令jg 进行两个标志比较(ZF = 0 和 SF = OF),但 jge 只做一个(SF = OF)。

所以我想说两者都使用几乎相同的寄存器和 CPU 周期,与 i >= 0 相比可能要快一些。

【讨论】:

  • 即使 2 个标志比较而不是一个也需要相同数量的周期,不是吗?
  • @RSinohara 我不这么认为。以编程代码中的相同示例:if (something)if (something && something_else) 之间较慢的是什么?
  • 加载立即数 -1 可能会更昂贵或需要更多字节。不清楚,JIT 是否将一种形式优化为另一种形式。
  • @usr 没有。看一下:intel.com/content/dam/www/public/us/en/documents/manuals/… 每个 jcc(如果条件跳转)在附录 C 的延迟/吞吐量表中分组在一起。
  • @RSinohara 我说的是加载常量-1,而不是跳转。显然,所有跳跃和比较的成本都相同(很小)。
【解决方案2】:

好吧,根据逻辑 > 操作可能比 >=“便宜”,但我猜你是在启用优化选项的情况下进行编译,所以编译器可能会做任何他想做的事情来优化你的代码,所以我会说那不没关系,即使一个真的更快,也可能编译器将其更改为最佳选项

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      相关资源
      最近更新 更多