[英]c++ steps as efficiency
這是關於估算效率的原則的問題。 在我的一個項目中,我遇到了這種情況:一個函數獲得兩個正整數並返回兩個中的最低值。 我想知道我通常使用的這種方法,在計算步數時,是一種估算效率的方法,以及是否有其他方法,或者我是否應該總是簡單地比較它們的運行速度。
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的步驟較少,但其中一個步驟是分支(if),歷史上一直很慢。
一些架構允許兩個分支(if和else)同時執行,這可能使它再次快速。 它還可能導致分支預測泄漏,對其他代碼產生連鎖反應,減慢其他因素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.