这是关于估算效率的原则的问题。 在我的一个项目中,我遇到了这种情况:一个函数获得两个正整数并返回两个中的最低值。 我想知道我通常使用的这种方法,在计算步数时,是一种估算效率的方法,是否有其他方法,或者我是否应该总是简单地比较它们的运行速度。
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,因为它似乎有更少的步骤。
答案 0 :(得分:0)
对于这种尺寸的功能,几乎可以肯定无关紧要,因为无论如何功能都会很快运行。
然而,对于大型计算,该方法肯定是合理的。事实上,计算这样的“步骤”是计算机科学子领域的基础,"analysis of algorithms."
在实践中,你需要更多的步骤才能真正重要 - 至少成千上万,除非这些步骤非常昂贵。
答案 1 :(得分:0)
计数步骤是分析算法的渐近效率的一种方法。这可以衡量算法扩展到更大输入的程度。
然而,为了比较两个函数的速度,对于固定的输入大小,我们真的需要看看它们实际执行的速度。计算步骤充其量只是一个粗略的指导,因为:
关于哪些操作可能比其他操作慢,有很多经验法则,但唯一可以确定的方法是在一个设置中测量,以便将您的实际用例重现尽可能。
在此特定代码中:
版本2的步骤较少,但其中一个步骤是分支(if),历史上一直很慢。
某些体系结构允许两个分支(if和else)同时执行,这可能会使其再次快速运行。它还可能导致分支预测泄漏,对其他代码产生连锁反应,减慢其他代码。