c ++作为效率的步骤

时间:2016-10-30 11:12:06

标签: c++ performance-estimation

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

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,因为它似乎有更少的步骤。

2 个答案:

答案 0 :(得分:0)

对于这种尺寸的功能,几乎可以肯定无关紧要,因为无论如何功能都会很快运行。

然而,对于大型计算,该方法肯定是合理的。事实上,计算这样的“步骤”是计算机科学子领域的基础,"analysis of algorithms."

在实践中,你需要更多的步骤才能真正重要 - 至少成千上万,除非这些步骤非常昂贵。

答案 1 :(得分:0)

计数步骤是分析算法的渐近效率的一种方法。这可以衡量算法扩展到更大输入的程度。

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

  1. 执行的步骤不是C ++语句,而是编译的机器码指令
  2. 即使你的C ++语句都编译成相同数量的指令(他们可能不会这样做),指令也不会花费相同的时钟周期来执行
  3. 即使它们都具有相同的概念延迟,这些功能也可能会被内联,这意味着单独考虑这些功能并不是很有用。您需要知道它们如何影响每个呼叫站点的优化代码
  4. 关于哪些操作可能比其他操作慢,有很多经验法则,但唯一可以确定的方法是在一个设置中测量,以便将您的实际用例重现尽可能。

    注意

    在此特定代码中:

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

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