亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c# 反射用法及效率對比

 更新時間:2021年02月19日 11:52:17   作者:丹楓無跡  
這篇文章主要介紹了c# 反射用法及效率對比,幫助大家更好的理解和學習使用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
{
  // 測試次數(shù)
  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.CreateInstance 要比 Activator.CreateInstance 慢,主要的性能損耗在 Assembly.GetType

反射調用類的方法

class Program
{
  // 測試次數(shù)
  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} - 使用反射創(chuàng)建出來的委托調用");
  }

  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# 反射的資料請關注腳本之家其它相關文章!

相關文章

  • 使用C#驗證PDF數(shù)字簽名有效性的方法示例

    使用C#驗證PDF數(shù)字簽名有效性的方法示例

    數(shù)字簽名作為PDF文檔中的重要安全機制,不僅能夠驗證文件的來源,還能確保文件內容在傳輸過程中未被篡改,本文將詳細介紹如何使用免費.NET控件通過C#驗證PDF簽名的有效性以及驗證PDF文檔是否被修改,需要的朋友可以參考下
    2024-07-07
  • WPF實現(xiàn)背景燈光隨鼠標閃動效果

    WPF實現(xiàn)背景燈光隨鼠標閃動效果

    這篇文章主要為大家詳細介紹了WPF實現(xiàn)背景燈光隨鼠標閃動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C#?md5?算法實現(xiàn)代碼

    C#?md5?算法實現(xiàn)代碼

    相對C#來說,md5算法就相對簡單很多,因為?System.Security.Cryptography;?已經(jīng)包含了md5算法。所以我們只需創(chuàng)建MD5類對象即可實現(xiàn)md5算法,今天通過本文給大家介紹C#?md5?算法實現(xiàn),感興趣的朋友一起看看吧
    2022-11-11
  • C# ListView 點擊表頭對數(shù)據(jù)進行排序功能的實現(xiàn)代碼

    C# ListView 點擊表頭對數(shù)據(jù)進行排序功能的實現(xiàn)代碼

    這篇文章主要介紹了C# ListView 點擊表頭對數(shù)據(jù)進行排序功能的實現(xiàn)代碼,需要的朋友可以參考下
    2017-04-04
  • C#調用C++使用C++/CLI的實現(xiàn)

    C#調用C++使用C++/CLI的實現(xiàn)

    在C#開發(fā)過程中,我們可能會遇到需要調用Windows API 或是第三方庫的場景,本文主要介紹了C#調用C++使用C++/CLI的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • C# 獲取程序集版本、文件版本

    C# 獲取程序集版本、文件版本

    C# 獲取程序集版本、文件版本的實現(xiàn)代碼。
    2009-09-09
  • C#中判斷一個集合是否是另一個集合的子集的簡單方法

    C#中判斷一個集合是否是另一個集合的子集的簡單方法

    本文介紹利用C#中內置的系統(tǒng)函數(shù)判斷一個集合是否是一個集合的子集的方法,此方法代碼量極少,分享給大家。
    2016-04-04
  • 詳解MongoDB for C#基礎入門

    詳解MongoDB for C#基礎入門

    本篇文章主要介紹了MongoDB for C#基礎入門,具體介紹了c#中關于對MongoDB的連接,插入,查詢等,有需要的可以了解一下。
    2016-12-12
  • C#實現(xiàn)航班查詢及預訂功能

    C#實現(xiàn)航班查詢及預訂功能

    這篇文章給大家介紹利用C#完成航班機票信息查詢,航班機票預定等功能。代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-02-02
  • C#求數(shù)組中元素全排列的方法

    C#求數(shù)組中元素全排列的方法

    這篇文章主要介紹了C#求數(shù)組中元素全排列的方法,較為詳細的分析了數(shù)組全排列算法的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08

最新評論