可能重複:
What is the performance cost of having a virtual method in a C++ class?接口的使用是否會減慢程序速度?
難道接口減慢程序?我聽說過這種情況,因爲在運行期間,每次使用實現此接口的對象時,必須決定實現此對象所屬接口的哪個類。
我特別感興趣的是C++的答案,但也是一般。如果這是真的,一些數字也會有幫助。
非常感謝!
可能重複:
What is the performance cost of having a virtual method in a C++ class?接口的使用是否會減慢程序速度?
難道接口減慢程序?我聽說過這種情況,因爲在運行期間,每次使用實現此接口的對象時,必須決定實現此對象所屬接口的哪個類。
我特別感興趣的是C++的答案,但也是一般。如果這是真的,一些數字也會有幫助。
非常感謝!
雖然比利指出這很像other post on SO,但我認爲它不完全一樣......主要是因爲這個問題措辭的方式。
因爲奧爾加談到一個「決定」,我幾乎認爲她在使用接口和使用派生類之間混淆了,並且通過dynamic_cast確定指向該對象的指針是否屬於特定類。
如果您正在討論使用dynamic_cast,那麼根據我的理解(並且這不是基於具體的性能數字),您將獲得相當顯着的性能。
如果你正在談論使用接口,那麼我覺得做一個vtable查找和額外的調用的次要攻擊遠遠勝過一個更好的軟件設計。
是的,但不是很重要,如果您需要接口需要的靈活性,那麼這些並不重要。 (請記住,如果您使用的是大量接口,則vtables的相關位將以L1或L2緩存結束,因此幾乎不會像您擔心的那樣多。)
動態分派(即使用虛擬功能)比直接呼叫更昂貴。
但它必須是一個不尋常的計劃,因爲這是性能限制器。更可能限制性能的是磁盤/網絡訪問,更新UI或內存帶寬等。
如果您使用接口模式(即C++中的抽象類),那麼是的,虛擬函數調用會有開銷。但是如果你實現了你自己的非抽象類機制來實現同樣的目標,你也會有一個開銷,可能比VF的調用要大。所以實際上,沒有額外的開銷。
你可能在談論C++中的虛擬繼承。如果在關鍵代碼路徑中不使用虛擬類,性能損失很小。基本上開銷與額外的函數調用相同。
+1 L1和L2緩存 - 有趣的,相關的和新的 – Elemental 2010-04-26 14:37:41