sidristij/dotnetbook

Virtual method performance

ZloyChert opened this issue · 3 comments

"Вызов виртуальных методов хоть и идет через таблицу VMT, но из-за того что индексы заранее известны, то по сути каждый вызов нагружается на единственное разыменовывание указателя. В 99,999% случаев это не повлияет вообще ни на что: проседание (если вообще можно так выразиться) будет настолько маленьким что им в принципе можно принебречь"
По сравнению с невиртуальными методами, проседание все же будет не таким незначительным, т.к. насколько я помню, при вызове невиртуальных методов нет необходимости в разыменовании указателя на таблицу методов, т.к. есть возможность вызвать метод напрямую.
Также виртуальный метод автоматически убирает возможность мощной оптимизации - встаивания метода, что логично, т.к. тип объекта становится известным только во время выполнения.

Также вызов виртуального метода сопровождается не одним разыменованием указателя. После разыменования указателя на таблицу методов, разыменовывается и список методов. То есть фактически экономия в 2 разыменования.

Тут тоже зависит от. Например, если класс - sealed, то тут практически гарантия того что вызваны будут конкретные методы и можно их вызвать напрямую. А при вызове по таблице имеем:

  • адрес VMT - в регистр
  • call по адресу, полученному при чтении по адресу "VMT+смещение" - это одна инструкция asm
MOV ECX, [EAX]    // Get VMT pointer into ECX 
CALL [ECX+0x014]  // Virtual dispatch via VMT method slot
  • Добавить asm пример для вызова через VMT