哪些功能运行得更快?

时间:2013-04-30 19:26:22

标签: c++ performance

第一种情况:

void lowTermReduction(int numerator, int denominator) {
    int gcd = GCD(numerator, denominator);
    numerator /= gcd;
    denominator /= gcd;
}

第二种情况:

void lowTermReduction(int numerator, int denominator) {
    int gcd = GCD(numerator, denominator);
    if (gcd != 1) {
        numerator /= gcd;
        denominator /= gcd;
    }
}

哪一个效率更高(快)? 在第一种情况下,函数始终执行除法,如果此除法为1并且不更改numeratordenominator中的值。我不知道CPU在做12/1或12/2时是否更快,但我认为这是完全相同的 在第二种情况下,当大公约数除以1时,该函数仅执行除法 。但在这种情况下,它执行逻辑运算if。 有效率差异?如果是这样,他们相关吗?

5 个答案:

答案 0 :(得分:3)

如果没有对具有典型用例的具体CPU架构进行概要分析,很难说哪一个更快。

但是让我们来看看这两个版本:

第一版:

  • 没有'if'所以总是会执行两个分区。
  • 此外,总是有两次读取和两次写入内存(或CPU寄存器)。

第二版:

  • 始终存在比较操作,这也会导致一次内存读取(或读取CPU寄存器)
  • 但是,只有在'if'条件为真的情况下才会执行这两个分区。
  • 此外,如果满足条件,则再次进行两次读取和两次写入。

所以它实际上取决于'if'条件的真实频率,而这又取决于用例。但是,一般来说,我会说第一个版本更快,因为大多数时候第二个替代版中的'if'条件无论如何都会实现。因此,大多数情况下,您将获得“if”条件的一个比较操作和一个读取操作,以及两个读取和两个写入操作,以及“if”块的两个除法操作。

答案 1 :(得分:2)

答案取决于您通常输入功能的输入。如果大多数时候GCD最终为1,那么第二个函数将执行更少的指令。如果大多数时候GCD最终与1不同,那么第一个函数将执行更少的指令。

此功能不太可能成为您系统的瓶颈。您应该对整个系统进行概要分析,并且只优化实际上花费最多时间的部分。

答案 2 :(得分:1)

大多数计算机中的分区是CPU可以执行的最慢的算术运算之一,另一方面,条件跳转非常快(如果你现在忘记了管道问题)。

但是,首先你需要弄清楚这是否真的是你程序中的瓶颈。然后,您需要测量两个版本的时间。

最后,我猜你不会看到任何性能提升,因为你将数字除以1,所以这应该非常快,你可能只会在这里引入速度问题,所以if版本可能会变慢。

请务必阅读this问题中Bill的回答。

答案 3 :(得分:0)

第一种情况平均更快。原因是,第二个函数将始终必须进行该比较,然后如果认为必要则进行除法。虽然如果只执行一次或两次,你就不会注意到差异,但如果它是一个多次运行的更大功能的一部分,它可能会更加明显。

第一个在调用时总是会执行1次操作,因此如果调用n次,它将执行n次操作。第二种最佳情况将执行n次操作(如果每次调用的GCD为1),但最坏情况将执行2n次操作。所以我会说安全的赌注将是第一个案例

答案 4 :(得分:0)

因为第二个版本正在执行比较,所以第二个版本会更慢。

问题是:慢多少?

我的猜测是时间的​​改善并不重要。

如果你想加快程序,弄清楚如何摆脱分裂。