【问题标题】:Difference between evaluation of while(n>0) and while(n!=0)while(n>0) 和 while(n!=0) 评估之间的区别
【发布时间】:2015-12-18 08:16:26
【问题描述】:

while(n>0)while(n!=0)的评价有区别吗?基本上两者都以相同的条件退出。那么是否存在应该使用其中之一的情况?或者当循环被评估的次数相同时,它会通过改变循环条件来提高性能效率吗?

【问题讨论】:

  • 这取决于n 的起始值 - 如果它以负(或溢出)值开始,它们的行为会完全不同。另外,我认为如果一条汇编指令不同,可能会对性能产生很小的影响,但这确实是毫无意义的微优化。

标签: algorithm loops while-loop


【解决方案1】:

这取决于您的平台,但一般情况下,它的性能相同。 例如,对于 x86 架构,cmp 运算符将用于>!=Here你可以阅读更多。

【讨论】:

    【解决方案2】:

    除了条件不一样之外,性能上没有区别。

    【讨论】:

    • ...你在哪里证明没有性能差异?
    • @BinkanSalaryman 这是基于典型 CPU 中条件跳转的机器指令在运行时没有差异这一事实。但是欢迎你证明我错了。
    • @Henry:如果两种测试的分支预测逻辑不同,则行为可能会有所不同。 (虽然我真的不相信他们会这样做。)
    【解决方案3】:

    一般来说,差异是中性的。

    总之,人们可能会恶意想出一些特殊的方案,比如

    while (n > 0)
    {
      ...
      n++;
    }
    

    对比

    while (n != 0)
    {
      ...
      n++;
    }
    

    编译器可以推断出在第一次 sn-p 中测试只需要在第一次迭代中完成,并将 while 展开为 if

    【讨论】:

    • 很抱歉,在第一种情况下,我真的不明白你关于在 if 中展开的观点。
    • if (n > 0) { ...; n++; while (true) { ...; n++; } }
    • 好吧,我想到了 n 减少的场景:)。那么如果以这种形式重写代码,性能会有变化吗?
    • @Vini:无论如何,没有什么可衡量的。
    猜你喜欢
    • 2011-01-02
    • 2022-05-04
    • 2018-11-11
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2019-01-28
    相关资源
    最近更新 更多