簡體   English   中英

c ++作為效率的步驟

[英]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,因為它似乎有更少的步驟。

對於這種尺寸的功能,幾乎可以肯定無關緊要,因為無論如何功能都會如此快速地運行。

但是,對於大型計算,該方法肯定是合理的。 事實上,計算這樣的“步驟”是計算機科學子領域的基礎,稱為“算法分析”。

在實踐中,你需要更多的步驟才能真正重要 - 至少成千上萬,除非這些步驟非常昂貴。

計數步驟是分析算法的漸近效率的一種方法。 這是衡量算法擴展到較大輸入的程度的度量。

但是,為了比較兩個函數的速度,對於固定的輸入大小,我們真的需要看看它們實際執行的速度。 計數步驟充其量只是一個粗略的指導,因為:

  1. 執行的步驟不是C ++語句,而是它們編譯的機器代碼指令
  2. 即使你的C ++語句每個都編譯成相同數量的指令(它們可能沒有),指令並不都要執行相同數量的時鍾周期
  3. 即使它們都具有相同的概念延遲,這些函數也可能被內聯,這意味着單獨考慮它們並不是那么有用。 您需要知道它們如何影響每個呼叫站點的優化代碼

關於哪些操作可能比其他操作慢,有很多經驗法則,但唯一可以確定的方法是在盡可能接近地再現真實用例的設置中進行測量。


注意

在這個特定的代碼中:

  • 版本1看起來不會給出正確的結果,但忽略了 - 它有更多的步驟,但它們大多是整數算術,它經過大量優化並且通常很快
  • 版本2的步驟較少,但其中一個步驟是分支(if),歷史上一直很慢。

    一些架構允許兩個分支(if和else)同時執行,這可能使它再次快速。 它還可能導致分支預測泄漏,對其他代碼產生連鎖反應,減慢其他因素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM