【问题标题】:if statement inside a loop or vice versa循环内的 if 语句,反之亦然
【发布时间】:2015-03-29 15:01:08
【问题描述】:

我想知道哪个更有效。

假设我有这个代码:

while (i<10000){
   if (cond1)
      doSomething1();
   else if (cond2)
      doSomething2();
   else
      doSomething3();
}

现在 cond1cond2 是“恒定”条件,这意味着如果它为 i 发生一次,它将发生在所有这些条件中,并且只是其中一个他们可能是真的。 大多数时候,最后一个doSomething3() 会被执行。

如果我这样写会发生什么:

if (cond1){
   while (i<10000)
      doSomething1();
}
else if (cond2){
   while (i<10000)
      doSomething2();
}
else{
   while (i<10000)
      doSomething3();
}

因为我只检查一次 cond1cond2 是否更有效?

【问题讨论】:

  • 第二个 sn-p 更省时。
  • 我注意到 i 应该有一些增加或以其他方式改变的东西,但这对于这个问题来说大多无关紧要。
  • 只要根据if-else条件定义一个函数指针,然后while循环就可以了。

标签: c++ c performance


【解决方案1】:

你需要问的是哪个缓存效率更高。

在许多情况下,编译器可以为您和will rearrange your code to get the best results 解决这个问题。它这样做的能力很大程度上取决于doSomethingN 做了什么以及condN 是什么。如果condN 可以随时间变化,那么可能每次都需要对其进行物理检查,在这种情况下,您的代码无法大幅重新排列,并且在每次循环迭代时检查它可能确实要慢得多。但是,如果condN 是常量,则可以优化重复检查,基本上导致您的第一个代码被转换为第二个。

最终,唯一确定的方法是对其进行测量(并研究生成的组件,如果您能理解的话)。

【讨论】:

    【解决方案2】:

    乍一看,第二个看起来效率更高,毕竟一次检查显然比 10000 次检查更有效,嗯,更高效的性能,稍微多一点的代码是它的代价。

    但话又说回来,第一个的性能开销很可能可以忽略不计,您应该真正对两者进行基准测试,因为您知道,在您证明自己有性能问题之前,您不会遇到性能问题。

    无论如何,任何生产级编译器都可能能够在相当静态且易于分析的上下文中为您优化事物。

    这可能是另一种情况,其中有更多选项,在编译时可能无法预测。例如,您可以拥有条件和函数指针的哈希映射,因此您可以查找条件的函数指针并使用它来调用功能。当然,这会效率低得多,因为它将使用动态调度,这也意味着调用不能被内联,但这是你为让它更灵活付出的代价,例如使用这种方法你可以注册不同的函数和条件在运行时,您可以更改给定条件的功能等等。

    例如,假设您需要执行 10000 个操作,但每个操作都应依赖于前一个操作的结果。

    while (i &lt; 10000) cond = map[cond]();

    【讨论】:

      【解决方案3】:

      我想你已经回答了你自己的问题。是的,编写更高效的代码会更高效。

      编辑 @NeilKirk 有道理。由于您的编译器知道它在做什么,如果编译器可以检测到,手动检查外部只是至少有效,不一定有效循环期间条件不会改变。

      【讨论】:

      • 这不是答案,这是重言式。
      • @NeilKirk:在那种情况下,问题不是问题。 OP问“如果我做更少的事情来达到同样的效果,性能会更好吗?”,所以我告诉他“是的”。可悲的是,“是”对于 SO 来说有点短。
      • 我希望编译器对此进行优化,因此它不一定高效。
      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多