c++步骤作为效率

c++ steps as efficiency

本文关键字:效率 c++      更新时间:2023-10-16

这是一个关于评估效率背后的原则的问题。在我的一个项目中,我遇到了这种情况:一个函数得到两个正整数,并返回两个正整数中最小的那个。我想知道我通常使用的这种计算步数的方法是否是一种比较准确的估计效率的方法,以及是否有其他方法,或者我是否应该总是简单地比较它们的运行速度。

Function(int a, int b)
{
    int lowest = a - b;                   //3 steps, allocating, assigning and calculating
    lowest = lowest * lowest / lowest;    //3 steps, 2 in calculating, 1 in assigning
    //6 steps total
    return lowest;
}
Function(int a, int b)
{
    int lowest;        //1 step in allocating
    if(a > b){         // 2 steps, 1 in comparing, 1 in picking the outcome
        lowest = b;        // 1 step in assigning
                           // Total 4 steps
    }else{
        lowest = a;        // 1 step in assigning
                           // Total 4 steps
    }
    return lowest;
}

在这种情况下,我会选择函数2,因为它似乎有更少的步骤。

计算步数是分析算法渐近效率的一种方法。这是一种衡量算法扩展到更大输入的能力的方法。

然而,为了比较两个函数的速度,对于固定的输入大小,我们真的需要看看它们实际执行的速度。计算步骤在这里充其量是一个粗略的指导,因为:

    执行的步骤不是c++语句,而是编译到的机器码指令。
  1. 即使你的c++语句编译成相同数量的指令(它们可能不是),指令并不都需要相同数量的时钟周期来执行
  2. 即使它们都具有相同的名义延迟,这些函数也可能是内联的,这意味着孤立地考虑它们并没有那么有用。您需要知道它们如何影响每个调用站点的优化代码

关于哪些操作可能比其他操作慢有很多经验法则,但唯一确定的方法是在尽可能接近地再现您的真实用例的设置中进行度量。


注意

在此特定代码中:

  • 版本1看起来不像它会给出正确的结果,但忽略它-它有更多的步骤,但它们大多是整数算术,这是大量优化和通常快速
  • 版本2的步骤更少,但其中一个步骤是分支(if),这在历史上一直很慢。

    一些体系结构允许两个分支(if和else)同时执行,这可能会使它再次变快。它还可能导致分支预测溢出,对其他代码产生连锁反应,减慢其他代码的运行速度。

对于这种大小的函数,这几乎没有关系,因为函数无论如何都会运行得很快。

然而,对于大型计算,该方法绝对是合理的。事实上,像这样计算"步骤"是计算机科学的子领域"算法分析"的基础。

在实践中,您需要更多的步骤才能真正发挥作用-至少需要数十万个步骤,除非这些步骤异常昂贵。