我記得在線閱讀的地方,在EXTREMELY低延遲的情況下,最好使用虛擬函數來替代IF語句。使用虛函數而不是IF語句更快?
這是真的嗎?他們基本上說動態多態對速度更好嗎?
是否有任何用戶有任何其他C++低延遲「怪癖」,他們可以共享?
我記得在線閱讀的地方,在EXTREMELY低延遲的情況下,最好使用虛擬函數來替代IF語句。使用虛函數而不是IF語句更快?
這是真的嗎?他們基本上說動態多態對速度更好嗎?
是否有任何用戶有任何其他C++低延遲「怪癖」,他們可以共享?
我非常懷疑單個if/else語句會比使用虛函數慢一些:虛函數通常會強制執行管道停頓並限制優化機會。 if語句可能會拖延管道,但如果它經常執行,則預測可能會正確。然而,如果你的選擇是在幾個if/else語句的級聯和只是一個虛擬函數調用之間進行,而後者可能會更快。另外,如果通過使用虛擬功能與分支執行的總代碼是不同的功能,則結果會大大減小,這可能會導致指令高速緩存上的高速緩存未命中。也就是說,這取決於情況。最好的方法是測量。請注意,測量只是試圖調查兩種方法之間的差異但並未真正進行任何處理的人工代碼會產生令人誤解的結果。但是,當您需要生成非常低延遲的代碼時,您通常可以花更多時間來實現它,即嘗試多種不同的方法可能是可行的。
儘管我的同事們傾向於對我的模板方法感到不滿,以避免運行時分支,但我最終編寫的代碼通常編譯速度非常慢,但運行速度非常快。當然,這取決於編譯時已知的函數或分支。在我使用過的區域中,例如對於消息處理,通常有一個動態決定就足夠了,例如,一個用於每個消息(即一個虛擬函數調用),隨後是不涉及任何動態類型的處理(這仍然是條件,例如對於表中的值的量)。
注意某些處理器也嘗試預測間接分支(例如,AMD家族15H有512個分錄表),從而增加了「在上下文中衡量和衡量」建議的重要性。 – AProgrammer 2012-01-15 15:58:54
我認爲這取決於一系列因素 - 包括至少有多少個if級聯。考慮AST中每個節點的編譯器和[訪問者模式](http://en.wikipedia.org/wiki/Visitor_pattern)。當然,使用這種模式可能會導致其他不太理想的特性,例如在一堆類中擴展代碼。 – 2012-01-15 00:50:02
就像一個好的輪胎,你首先需要一件事:輪廓,輪廓,輪廓。 – 2012-01-15 00:58:09
我認爲這將高度依賴於確切的代碼,唯一真正的答案是時間數十億次,看看有什麼不同。 – 2012-01-15 01:09:41