第一种情况:
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并且不更改numerator
和denominator
中的值。我不知道CPU在做12/1或12/2时是否更快,但我认为这是完全相同的
在第二种情况下,当大公约数除以1时,该函数仅执行除法 。但在这种情况下,它执行逻辑运算if
。
有效率差异?如果是这样,他们相关吗?
答案 0 :(得分:3)
如果没有对具有典型用例的具体CPU架构进行概要分析,很难说哪一个更快。
但是让我们来看看这两个版本:
第一版:
第二版:
所以它实际上取决于'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)
因为第二个版本正在执行比较,所以第二个版本会更慢。
问题是:慢多少?
我的猜测是时间的改善并不重要。
如果你想加快程序,弄清楚如何摆脱分裂。