哪個更重要?是否用一個條件if
聲明封閉數組元素交換以防止冗餘交換,比如說與自己交換更有效率?關於效率,邏輯比較vs冗餘內存操作
或者不得不一直檢查一個唯一的概率條件效率更低?說特殊情況的機會增加每個調用。假設你正在開發一個算法,並試圖檢查效率:比較或交換(如插入排序)。
if(condition)
exchange two elements
哪個更重要?是否用一個條件if
聲明封閉數組元素交換以防止冗餘交換,比如說與自己交換更有效率?關於效率,邏輯比較vs冗餘內存操作
或者不得不一直檢查一個唯一的概率條件效率更低?說特殊情況的機會增加每個調用。假設你正在開發一個算法,並試圖檢查效率:比較或交換(如插入排序)。
if(condition)
exchange two elements
這在很大程度上取決於你的處理器架構,多久這將完成,吞吐量的處理要求,做說交流的成本,在這種情況下,唯一可行的,現實世界的答案是:「個人資料,個人資料和個人資料更多」。基本上,如果CPU從分支預測失敗中受到嚴重影響,並且元素的交換是微不足道的,那麼忽略條件是有意義的。然而,如果您的目標CPU架構可以支持相當數量的分支未命中預測,並導致過多的停頓或交換元素的代價是而不是不重要,那麼您可能會獲得性能,具體取決於所述數組的大小。您也可以使用MOVcc
/CMPXCHG
等指令,或者使用非x86對應指令(儘管這種情況下,您仍然需要讀取+比較,但它會消除分支)。
有了這麼多的變量輸入,有必要分析你的代碼並找出它真正的瓶頸,像VTune或CodeAnalyst這樣的東西也會給你分支預測失敗的統計數據,所以你可以看到它對你的算法有多大影響整個。
查看任何條件評估代碼以詢問「每個結果的概率是多少?」的有用方法
例如,它有一個測試表達式test
,它的真實概率是1/100,那麼平均而言,它告訴你很少,因爲你在處理器週期中的投資。
事實上,你可以量化。 如果這是真的,那麼你學到的信息量是相當不錯的。 它大概是log2(100/1)= 6.6位,但只發生100次中的1次。 另外99次,你學到的信息量是log2(100/99)= .014位。 幾乎沒有。 所以這樣的情況平均只會告訴你很少的情況。這不是「工作」非常困難。
完成量化的一個好方法是將你從每個結果中學到的東西乘以outcode的概率,然後將它們相加。 這告訴你你學到的東西的平均值爲。
這是6.6 * 1/100 + .014 * 99/100 = .066 + .014 = .08位,這是非常差。 (這個數字被稱爲熵的決定。)
在另一方面,如果你有一個決策點,其中每個結果同樣是可能的,它獲悉平均一個完整的1位。事實上,這是二元決策可能做的最多的工作。
所以,如果你擔心條件測試的性能(你可能不會),試着讓它贏得它的週期。