Трудно сказать наверняка, потому что JIT-компилятор.NET может оптимизировать издержки далеко в некоторых (многие?) случаи.
, Но если это не оптимизирует его далеко, мы в основном говорим о дополнительной косвенности указателя.
таким образом, при вызове невиртуального метода Вы имеете к
1, то же в обоих случаях. Что касается 2, с виртуальным методом, необходимо вместо этого читать из фиксированного смещения в vtable объекте, и затем перейти к тому, везде, где это указывает. Это делает предсказание ветвлений тяжелее, и оно может продвинуть некоторые данные из кэша ЦП. Таким образом, разница не огромна, но она может сложить при создании каждого вызова функции виртуальным.
Это может также запретить оптимизацию. Компилятор может легко встроить вызов к невиртуальной функции, потому что он знает точно, какая функция вызвана. С виртуальной функцией, которая немного более хитра. JIT-компилятор может все еще смочь сделать это, после того как это определяется, какая функция вызвана, но это - намного больше работы.
, В целом, это может все еще сложить, особенно в критических по отношению к производительности областях. Но это не что-то, что необходимо взволновать по поводу того, если функция не вызвана по крайней мере несколько сотен тысяч раз в секунду.
Извините - неправильный выбор ключевого слова. Рано утром, без кофе ...
Оказывается, есть несколько примеров в разделе «WPF DataGrid Drag and Drop». Вот три: