2013-03-26 2 views
1

Скажем, у меня есть C# интерфейс, называемый IMyInterface определяется следующим образом:Являются ли виртуальные свойства более медленными, чем конкретные свойства?

// C# code 
public interface IMyInterface 
{ 
    string MyProperty { get; } 
} 

Предположим, у меня также есть C++/класс CLI, MyConcreteClass, который реализует этот интерфейс, и чей заголовок объявлен следующим образом:

public ref class MyConcreteClass : public IMyInterface 
{ 
public: 
    virtual property String^ MyProperty 
    { 
    String^ get() sealed { return String::Empty; }; 
    void set(String^ s) sealed { }; 
    } 
}; 

Очевидно, что при доступе к виртуальному члену через интерфейс среда выполнения должна искать реализацию в классе и будет медленнее, чем если бы член не был виртуальным.

IMyInterface obj; 
obj->MyProperty = "HELLO"; 

Я спрашиваю конкретно об эффективности использования виртуальных элементов непосредственно на конкретном типе объекта. Это медленнее, если MyProperty был виртуальным членом?

MyConcreteClass obj; 
obj->MyProperty = "HELLO"; 
+4

Проведите некоторые бенчмаркинга и посмотрите результат. –

+1

Есть такая поговорка: цифры говорят сказку. Выполняйте бег с плотной петлей в несколько сотен тысяч или даже миллион раз с виртуальным и конкретным свойством и * измерьте разницу. Есть причина, почему существуют анализаторы Profiler и анализа производительности;) – RobIII

+1

Это звучит как случай преждевременной микрооптимизации. – JustAnotherUserYouMayKnow

ответ

4

Виртуальные методы медленнее, потому что время выполнения должно проверять фактическую реализацию метода. Таким образом, это 1 дополнительная проверка. Вы все еще можете сотнями тысяч в секунду. Так что не стесняйтесь об этом. В Java каждый метод по умолчанию является виртуальным.

UPDATE: Я не уверен, что введение C++ меняет ситуацию. Я предполагаю, что это будет похоже на то, что вы по-прежнему получаете доступ к виртуальному методу. Я не уверен, как это изменит его. Но в очередной раз это моя догадка. Надеюсь, кто-то еще может помочь больше.

+0

Я обновил свой вопрос с конкретными данными, которые я ищу. Можете ли вы обновить свой ответ, чтобы его отразить? –

Смежные вопросы