c++步骤作为效率

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

最佳答案

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

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

  1. 执行的步骤不是 C++ 语句,而是它们编译成的机器代码指令
  2. 即使您的每个 C++ 语句都编译为相同数量的指令(它们可能不会),指令也不会全部花费相同数量的时钟周期来执行
  3. 即使它们都具有相同的概念延迟,这些函数也可能是内联的,这意味着孤立地考虑它们并没有多大用处。您需要了解它们如何影响每个调用站点的优化代码

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


注意事项

在此特定代码中:

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

    有些架构允许两个分支(if 和 else)同时执行,这可能会再次加快速度。它还可能导致分支预测溢出,对其他代码产生链式 react ,从而减慢其他代码的速度。

关于c++步骤作为效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40328447/

相关文章:

c++ - vftable 是按派生类的对象编译的吗?

c++ - 显示 32 位位图 - 调色板

c++ - 重载 << 运算符和递归

c++ - 编辑和播放实时 PCM

c++ - 将成员枚举变量传递给类构造函数时出现无效重定义错误

算法速度顺序

sql-server - 我应该如何估计 SQL Server 2005 数据库的硬件要求?

Android 设备性能评估技术