【问题标题】:time complexity of if else statement c#if else语句的时间复杂度c#
【发布时间】:2020-09-16 22:37:53
【问题描述】:

从处理/时间复杂度的角度来看,以下两者中哪一个更有效 - 抱歉,我只是想了解一下时间复杂度和对计算机处理时间的潜在影响:

选项 1

if (condition1) {
  function1();
  function2();
} 
else {
  function3();
}

选项 2

if (condition1) {
  function1();
}
else {
  function3();
}

if (condition1) {
  function2();
}
else {
  function3();
}

假设 function1() 和 function2() 都是 O(N),我认为选项 1 和选项 2 都是 O(N) 时间复杂度。但是,如果我们可以测量这两个选项在同一台计算机上运行的速度有多快,那么选项 1 会更快还是差别很小?

谢谢!

【问题讨论】:

    标签: c# performance time-complexity processing-efficiency


    【解决方案1】:

    if 的时间复杂度是恒定的,即 O(1)。两个if 的复杂性也是如此。

    如果函数为 O(N),则整体复杂度为 O(N)。


    时间复杂度不是衡量效率的标准,而是衡量可扩展性的标准。它没有说明算法需要多少资源(CPU 周期、内存……),而是说明当您将输入大小加倍时它将获取多少更多

    请先把你的头包起来;时间复杂度讨论了与单个操作的成本不同的问题。不要把它混为一谈。


    至于实际性能差异:

    选项 2 将调用 function3() 两次,因此比较取决于此。

    如果函数做任何重要的处理,两个选项之间的差异将可以忽略不计,它将以函数的波动为主。

    一般来说,琐碎操作(如if)的性能不能在没有上下文的情况下讨论。

    对于条件跳转,主要问题是:它们的可预测性如何?
    即他们大部分时间都采用相同的分支吗?两个可良好预测的条件跳转比一个预测不好的条件跳转要好得多。

    【讨论】:

      【解决方案2】:

      选项 2 不能比选项 1 快,因为它至少做同样多的工作来确定要调用的函数。另请注意,当条件 1 为 false 时,选项 2 会导致对 function3 的两次调用,因此在这种情况下,它的工作量是原来的两倍(假设函数的工作量比所示的 sn-ps 多得多,它只是找出要调用的函数)。

      在实践中,这些可能具有完全相同的性能(忽略对 function3 的重复调用),因为优化编译器将识别为选项 2 呈现二进制代码的机会,这看起来更像您对选项的期望1. 在没有优化的情况下,您正在查看一个额外的条件分支,我认为在合理的假设下可以安全地将其描述为最小量的额外开销。现在,如果这是在一个紧密的循环中,优化被关闭并且条件 1 几乎总是错误的,那么也许你会看到更多的问题(由于许多错过的分支预测中断了管道)但我对此表示怀疑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-14
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多