我一直在閱讀虛擬方法以及它們是如何被調用的。正如所討論的here和here,我已經得出結論,他們不應該真的如此不同。虛擬方法比非虛擬方法要慢
C#編譯器發出IL代碼,該代碼通過call
IL指令調用靜態方法,並通過callvirt
調用虛擬/非虛擬成員。看起來JIT的工作實際上是確定被調用的方法對象是否實際爲空。所以這兩項檢查都是一樣的。另外,正如在第一篇文章中討論的那樣,在編譯時,看起來vtables或者表格保存着方法定義的元數據,在編譯時被展平了。換句話說,這些表確切地包含了對象應該調用的方法,而不需要對繼承鏈進行遞歸搜索。
綜上所述,爲什麼虛擬方法被認爲比較慢?也許是一個間接的(如果有的話)那麼大的一筆交易?請解釋...
* CLR只通過調用IL指令調用靜態方法*是有誤導性的。它是C#編譯器,它爲靜態和'callvirt'發出'call'指令作爲實例方法。其他編譯器可以自己的方式自由地實現它。 CLR與此無關。 – 2014-10-09 15:14:38
@SriramSakthivel真。我會換個話。 – 2014-10-09 15:15:52
相關:http://stackoverflow.com/questions/530799/what-are-the-performance-implications-of-marking-methods-properties-as-virtual – 2014-10-09 15:28:53