c\#반사 용법 및 효율 대비

6565 단어 c#반사능률.
반사 실례 화 류

public class Person
{
  public string Name { get; set; }

  public Person(string name)
  {
    this.Name = name;
  }

  public string Say(string msg)
  {
    return $"{Name}: {msg}";
  }
}

class Program
{
  //     
  const int count = 10000000;

  static void Main(string[] args)
  {
    CreateInstance0();
    CreateInstance1();
    CreateInstance2();
    CreateInstance3();
    CreateInstance4();

    Console.Read();
  }

  static void CreateInstance0()
  {
    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (var i = 0; i < count; i++)
    {
      Person person = new Person("  ");
    }

    watch.Stop();
    Console.WriteLine($"{watch.Elapsed} - new");
  }

  static void CreateInstance1()
  {
    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (var i = 0; i < count; i++)
    {
      object person = Activator.CreateInstance(typeof(Person), "  ");
    }

    watch.Stop();
    Console.WriteLine($"{watch.Elapsed} - Activator.CreateInstance");
  }

  static void CreateInstance2()
  {
    Assembly assembly = Assembly.GetExecutingAssembly();

    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (var i = 0; i < count; i++)
    {
      Person obj = (Person)assembly.CreateInstance("ConsoleTest.Person", true, BindingFlags.Default, null, new object[] { "  " }, null, null);
    }

    watch.Stop();
    Console.WriteLine($"{watch.Elapsed} - Assembly.CreateInstance");
  }

  static void CreateInstance3()
  {
    Assembly assembly = Assembly.GetExecutingAssembly();

    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (var i = 0; i < count; i++)
    {
      Type type = assembly.GetType("ConsoleTest.Person");
      object person = Activator.CreateInstance(type, "  ");
    }
    watch.Stop();
    Console.WriteLine($"{watch.Elapsed} - Assembly.CreateInstance1");
  }

  static void CreateInstance4()
  {
    Assembly assembly = Assembly.GetExecutingAssembly();

    Stopwatch watch = new Stopwatch();
    watch.Start();

    Type type = assembly.GetType("ConsoleTest.Person");
    for (var i = 0; i < count; i++)
    {
      object person = Activator.CreateInstance(type, "  ");
    }
    watch.Stop();
    Console.WriteLine($"{watch.Elapsed} - Assembly.CreateInstance2");
  }
}
  • 반사 실례 화 대상 을 통 해 직접 new 보다 50 배 정도 느리다
  • assembly.Create Instance 는 Activator.Create Instance 보다 느 리 고 주요 성능 손실 은 Assembly.GetType
  • 반사 호출 클래스 의 방법
    
    class Program
    {
      //     
      const int count = 10000000;
    
      static void Main(string[] args)
      {
        InvokeMethod0();
        InvokeMethod1();
        InvokeMethod2();
        InvokeMethod3();
        InvokeMethod4();
    
        Console.Read();
      }
    
      static void InvokeMethod0()
      {
        Person person = new Person("  ");
    
        Stopwatch watch = new Stopwatch();
        watch.Start();
    
        for (var i = 0; i < count; i++)
        {
          string name = person.Say("Hello World!");
        }
    
        watch.Stop();
        Console.WriteLine($"{watch.Elapsed} -     ");
      }
    
      static void InvokeMethod1()
      {
        Person person = (Person)Activator.CreateInstance(typeof(Person), "  ");
    
        Stopwatch watch = new Stopwatch();
        watch.Start();
    
        for (var i = 0; i < count; i++)
        {
          string name = person.Say("Hello World!");
        }
    
        watch.Stop();
        Console.WriteLine($"{watch.Elapsed} -        ");
      }
    
      static void InvokeMethod2()
      {
        Person person = (Person)Activator.CreateInstance(typeof(Person), "  ");
        MethodInfo method = typeof(Person).GetMethod(nameof(Person.Say), new Type[] { typeof(string) });
        Func<string, string> func = (Func<string, string>)method.CreateDelegate(typeof(Func<string, string>), person);
    
        Stopwatch watch = new Stopwatch();
        watch.Start();
    
        for (var i = 0; i < count; i++)
        {
          string result = func("Hello World!");
        }
    
        watch.Stop();
        Console.WriteLine($"{watch.Elapsed} -              ");
      }
    
      static void InvokeMethod3()
      {
        Person person = (Person)Activator.CreateInstance(typeof(Person), "  ");
    
        MethodInfo method = typeof(Person).GetMethod(nameof(Person.Say), new Type[] { typeof(string) });
    
        object[] parameters = new object[] { "Hello World!" };
    
        Stopwatch watch = new Stopwatch();
        watch.Start();
    
        for (var i = 0; i < count; i++)
        {
          string name = (string)method.Invoke(person, parameters);
        }
    
        watch.Stop();
        Console.WriteLine($"{watch.Elapsed} -              ");
      }
    
      static void InvokeMethod4()
      {
        Person person = (Person)Activator.CreateInstance(typeof(Person), "  ");
    
        object[] parameters = new object[] { "Hello World!" };
    
        Stopwatch watch = new Stopwatch();
        watch.Start();
    
        for (var i = 0; i < count; i++)
        {
          string result = (string)(typeof(Person).GetMethod(nameof(Person.Say))?.Invoke(person, parameters));
        }
    
        watch.Stop();
        Console.WriteLine($"{watch.Elapsed} -         ");
      }
    }
  • 인 스 턴 스 를 반사 한 후 호출 방법 은 직접 호출 방법 과 효율 이 같다
  • .
  • 캐 시 반사 방법 호출 과 직접 사용 반사 호출 모두 효율 소모
  • 이상 은 c\#반사 용법 및 효율 대비 에 대한 상세 한 내용 입 니 다.c\#반사 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기