почему вызов метода путем отражения через интерфейс происходит намного быстрее - PullRequest
0 голосов
/ 31 октября 2011

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

 // first version
  class A
    {
        public void fn()
        { 
        }
    }
  void Main(String[]x)
  {
        Type type = typeof(A);
        object obj = Activator.CreateInstance(type);
        type.InvokeMember("fn", BindingFlags.Public, null, obj, null);
  }

  //second verison
   interface IA
    {
        void fn();
    }

    class A :IA
    {
        public void fn()
        {
        }
    }

 void Main(String []x)
 {
        Type type = typeof(A);
        IA obj =(IA) Activator.CreateInstance(type);
        obj.fn();
 }

Ответы [ 2 ]

6 голосов
/ 31 октября 2011

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

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

0 голосов
/ 31 октября 2011

Для сравнения яблок с яблоками вызовите Type.GetConstructor, чтобы получить объект ConstructorInfo, и вызовите его для создания вашего объекта.Затем вы можете сохранить ConstructorInfo и использовать повторно.Активатор очень медленный по сравнению.

Отвечая на ваш вопрос о том, как работает способ отражения:

Активатор ищет в метаданных загруженных сборок имя типа, соответствующее указанному вами.Затем он ищет конструктор, похожий на Type.GetConstructor, который возвращает ConstructorInfo.Он вызывает этот конструктор и возвращает объект.

Затем, когда вы вызываете Type.InvokeMember, вы снова используете отражение, запрашивая метаданные класса, чтобы найти соответствующую сигнатуру метода.Это возвращается как MethodInfo, который затем вызывается.

Тяжелая работа в отражении - это не сам вызов, а метаданные, которые ищут тип, конструктор и метод.Вот почему я говорил, что вы можете вызывать относительно высокопроизводительные вызовы методов для отраженных объектов, повторно используя объекты ConstructorInfo и MethodInfo.Вы найдете многократный вызов MethodInfo.Invoke намного быстрее, чем Type.InvokeMember

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...