【问题标题】:Boolean condition evaluated inside for loop performance在循环性能内部评估的布尔条件
【发布时间】:2016-01-27 18:08:15
【问题描述】:

我有两个循环。我不明白为什么第一个比我的第二个跑得快。能尽量简单解释吗?

第一:

for (int x1=0;x1<1000;x1++){
   for(int x2=0;x2<1000;x2++){
      if(x1<500){
         a[x2+x1*1000]=100;
      }
   }
}

第二:

bool cond;
for (int x1=0; x1<1000; x1++) {
    cond = x1<500;
    for(int x2=0; x2<1000; x2++){
        if(cond){
            a[x2+x1*1000] = 100;
        }
    }
}

(我简化了我的代码)

【问题讨论】:

  • 慢/快多少?显示实际基准。如果差异很小,则可能几乎是所有问题(包括由您无法影响的操作系统引起的低效率),并且可以良心忽略。
  • 在我的代码中,这个表达式会导致 %30 的代码变慢
  • 显示实际基准。但不可否认,这并不小。
  • 对不起,我不是很有经验的代码编写者,我只是想提高我的代码运行时间。我引用了一个循环的时间恶化
  • 任何体面的优化器都应该将任一测试提升到内部循环之外,因此应该没有性能差异。查看生成的 asm 代码将是了解优化器是否被一个版本而不是另一个版本混淆的最佳方法。

标签: c++ performance for-loop


【解决方案1】:

最简单的答案是当你使用时

if(x1<500){
      a[x2+x1*1000]=100;
          }

您实际上使用的是直接方法,在该方法中比较值并完成工作,但是当您使用时

if(cond) { 
  a[x2+x1*1000] = 100;
         }

然后它首先计算“cond”的答案,然后应用 if 条件,更具体地说,您可以将其视为 cond 是一个函数调用,而 if(x1

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多