3 回答

TA貢獻1848條經驗 獲得超2個贊
在最低級別(在硬件中),是的,如果 s昂貴。為了理解原因,您必須了解管道如何工作。
當前要執行的指令存儲在通常稱為指令指針(IP)或程序計數器(PC)的東西中。這些術語是同義詞,但是不同的術語用于不同的體系結構。對于大多數指令,下一條指令的PC就是當前PC加上當前指令的長度。對于大多數RISC架構,指令都是固定長度的,因此PC可以遞增恒定量。對于x86之類的CISC體系結構,指令可以是可變長度的,因此對指令進行解碼的邏輯必須弄清楚當前指令要找到多長時間才能找到下一條指令的位置。
但是,對于分支指令,要執行的下一條指令不是當前指令之后的下一個位置。分支是指令-它們告訴處理器下一條指令在哪里。分支可以是有條件的,也可以是無條件的,目標位置可以是固定的或計算的。
有條件與無條件比較容易理解-只有在滿足特定條件(例如,一個數字是否等于另一個數字)的情況下,才進行條件分支。如果不執行分支,則控制像往常一樣前進到分支之后的下一條指令。對于無條件分支,總是采用分支。條件分支顯示在if語句和forand while循環的控制測試中。無條件分支顯示在無限循環,函數調用,函數返回break和continue語句,臭名昭著的goto語句等中(這些列表遠非詳盡)。
分支機構目標是另一個重要問題。大多數分支都有固定的分支目標-它們會轉到編譯時固定的代碼中的特定位置。這包括if語句,各種循環,常規函數調用等等。 計算分支在運行時計算分支的目標。這包括switch語句(有時),從函數返回,虛擬函數調用和函數指針調用。
那么,這一切對性能意味著什么?當處理器看到分支指令出現在其管道中時,它需要弄清楚如何繼續填充其管道。為了弄清楚程序流中的分支后面有什么指令,它需要知道兩件事:(1)是否將采用分支;(2)分支的目標。弄清楚這一點稱為分支預測,這是一個具有挑戰性的問題。如果處理器猜對了,程序將以全速繼續。相反,如果處理器猜測正確,它只是花了一些時間計算錯誤的事情?,F在,它必須刷新其管道,并從正確的執行路徑中重新加載指令。底線:表現出色。
因此,語句昂貴的原因是由于分支的錯誤預測。這僅處于最低級別。如果您正在編寫高級代碼,則完全不必擔心這些細節。僅當您使用C或匯編語言編寫對性能至關重要的代碼時,才應考慮這一點。在這種情況下,即使需要更多指令,編寫無分支代碼通常也比分支代碼更好。有一些很酷位變換花樣,你可以做計算的東西,如abs(),min()和max()沒有分支。

TA貢獻2039條經驗 獲得超8個贊
“昂貴”是一個非常相對的術語,尤其是與“ if
”語句的關系,因為您還必須考慮條件的成本。范圍從任何簡短的cpu指令到測試調出遠程數據庫的函數的結果。
我不會擔心。除非您正在執行嵌入式編程,否則您可能根本不必擔心“ if
” 的成本。對于大多數程序員而言,它永遠不會成為您應用程序性能的驅動因素。
添加回答
舉報