條件控制,條件傳送與 builtin

2021-09-24 03:01:42 字數 1214 閱讀 6478

如果我們現在要寫乙個函式,引數為兩個整數,要求返回這兩個整數差的絕對值,我們會有如下的寫法。

int diff(int a,int b)

}int diff(int a,int b)

{ if(a我將用上邊的**來測試兩種寫法的效能。

首先對上邊的**使用gcc進行不優化的編譯。指令為 gcc -og -s a.c

編譯器忠實的翻譯了我們的**,比較兩個引數,通過zf決定是否跳轉,在兩個分支裡分別計算所需要的結果。

使用o1級別的優化。指令為 gcc -o1 -s a.c

在優化過後,正如上邊第二種寫法的思路,先計算兩種可能的值,然後再根據兩個引數之間的大小關係,決定把哪乙個值作為返回值。

存在這種優化的原因是處理器是通過使用流水線來獲得高效能,在流水線中,一條質量的處理要經過乙個系列的階段,每個階段執行所需操作的一小部分(例如,從記憶體中取指令,確定指令型別,從記憶體中讀資料,執行算術運算,向記憶體中寫資料,以及更新程式計數器)。這種方法通過重疊連續指令的步驟來獲得高效能,例如在取一條指令的同事,執行它前面一條指令的算術運算。要做到這一點,要求能夠事先確定要執行的指令序列,這樣才能保持流水線中充滿了待執行的指令。當機器遇到條件跳轉的時候,如果跳轉成功,那麼意味著計算機之前預先裝入流水線的指令都錯了(計算機總是按順序預裝指令),所有的指令都要被重新裝入(跳轉後的指令才是正確的),所以跳轉意味著程式效能的嚴重下降。

條件傳送相當於把原本可能浪費在跳轉的時間用在了計算另外一條分支上,所獲得的效能提公升取決於跳轉所浪費的時間和計算另外一條分支的時間對比。不過從另一點來看,由於只有最後返回之前才進行條件的判斷,條件傳送更有利於流水線一直處於滿的狀態,執行時間更加穩定。

道理雖然是這樣的,但是在我本機的實際測試中,並沒有明顯的效能差異,原因我推測可能是現代處理器應對指令的重灌已經不再是十分耗時的過程了。

再來看__bulitin_expect,既然我們知道跳轉會造成嚴重的效率損失,那麼程式的編寫者知道自己寫的某乙個if語句在大多數情況下會走向哪乙個分支時,可以選擇使用__bulitin_expect這個巨集來告訴編譯器這個if更有可能會選擇哪乙個分支,從而讓編譯器生成出跳轉可能比較小的彙編**。

IF條件控制

python 條件語句是通過一條或多條語句的執行結果 true 或者 false 來決定執行的 塊。如下圖所示 python區分大小寫 s upper s upper false s.lower upper true 邏輯判斷 表示式描述 a b a等於b a b a不等於b a b a大於b a ...

Sender傳送條件

傳送條件 1 full 如果乙個批次寫滿了 無論時間有沒有到 2 expired 時間到了 批次沒寫滿也得傳送 3 exhausted 記憶體不夠 訊息傳送出去以後,就會釋放記憶體 4 closed kafka producer 關閉前先將快取的資料傳送 this accumulator.ready...

python條件 Python 條件控制

python 條件控制 if 語句 python中if語句的一般形式如下所示 if condition 1 statement block 1 elif condition 2 statement block 2 else statement block 3 如果 condition 1 為 tru...