完善主體資料,免費贈送VIP會員!
      * 主體類型
      * 企業名稱
      * 信用代碼
      * 所在行業
      * 企業規模
      * 所在職位
      * 姓名
      * 所在行業
      * 學歷
      * 工作性質
      請先選擇行業
      您還可以選擇以下福利:
      行業福利,領完即止!

      下載app免費領取會員

      NULL

      ad.jpg

      二次開發教程:C# 反射性能

      發布于:2019-07-24 16:46:41

      網友投稿

      更多

      C# 創建對象可以直接用new,也可以用反射,下面測試一下反射創建的性能如何,


      這里可以比較一下,構造方法帶參數和不帶參數的區別。


      先創建一個測試類,分為構造函數帶參數和不帶參數,兩種情況來測試


          public class Test

          {

              public string Name { get; set; }

              public string Id { get; set; }

              public Test(string name, string id)

              {

                  Name = name;

                  Id = id;

              }

              //public Test()

              //{

              //    //Name = name;

              //    //Id = id;

              //}

          }


      要測試的方法有


      new 


      Assembly.CreateInstance


      Activator.CreateInstance


      ConstructorInfo.Invoke


      下面是測試代碼


          class Program

          {

              static void Main(string[] args)

              {

                  int m = 1000000;

                  int i = 0;



                  string typeName = typeof(Test).FullName;

                  Assembly ab = typeof(Test).Assembly;

                  Type type = typeof(Test);

                  ConstructorInfo cinfo = type.GetConstructors().First();



                  object[] ps = new object[] { "name", "id" };



                  Stopwatch stopWatch = new Stopwatch();

                  Console.WriteLine("---------------------------------------------");

                  Console.WriteLine("new");

                  stopWatch.Start();

                  Console.WriteLine(stopWatch.ElapsedMilliseconds);

                  while(i<m)

                  {

                      Test t = new Test("name","id");

                      i++;

                  }

                  Console.WriteLine(stopWatch.ElapsedMilliseconds);



                  stopWatch.Stop();

                  stopWatch.Reset();

                  i = 0;

                  Console.WriteLine("---------------------------------------------");

                  Console.WriteLine("assembly");

                  stopWatch.Start();

                  Console.WriteLine(stopWatch.ElapsedMilliseconds);

                  while (i < m)

                  {

                      Test t = ab.CreateInstance(typeName, false, BindingFlags.Public| BindingFlags.CreateInstance| BindingFlags.Instance, null, ps, null, null) as Test;

                      //Test t = ab.CreateInstance(typeName) as Test;



                      i++;

                  }

                  Console.WriteLine(stopWatch.ElapsedMilliseconds);



                  stopWatch.Stop();

                  stopWatch.Reset();

                  i = 0;

                  Console.WriteLine("---------------------------------------------");

                  Console.WriteLine("Activetor");

                  stopWatch.Start();

                  Console.WriteLine(stopWatch.ElapsedMilliseconds);

                  while (i < m)

                  {

                      Test t = Activator.CreateInstance(type,ps) as Test;

                      i++;

                  }

                  Console.WriteLine(stopWatch.ElapsedMilliseconds);



                  stopWatch.Stop();

                  stopWatch.Reset();

                  i = 0;

                  Console.WriteLine("---------------------------------------------");

                  Console.WriteLine("ConstructorInfo");

                  stopWatch.Start();

                  Console.WriteLine(stopWatch.ElapsedMilliseconds);

                  while (i < m)

                  {

                      Test t = cinfo.Invoke(ps) as Test;

                      //Test t = cinfo.Invoke(null) as Test;


                      i++;

                  }

                  Console.WriteLine(stopWatch.ElapsedMilliseconds);



                  Console.ReadLine();

              }

          }




      發現使用Assembly.CreateInstance是最慢的,使用new 是最快的


      當構造函數帶參數的時候,ConstructorInfo.Invoke是第二快的


      當構造函數不帶參數的時候Activator.CreateInstance是第二快的,


      查看Assembly.CreateInstance的源碼,發現他在內部是用Activator.CreateInstance創建的,但是多了一個尋找Type的過程,


      似乎尋找Type是一件很耗時間的過程

      本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。

      未標題-1.jpg

      上一篇:二次開發教程:C# 初探UI Automation

      下一篇:關于revit中2D軸網與3D的區別

      主站蜘蛛池模板: 亚洲国产视频一区| 日本亚洲成高清一区二区三区| 久久精品无码一区二区三区不卡 | 国产人妖视频一区在线观看| 亚洲av一综合av一区| 亚洲AV无码一区二区三区国产 | 白丝爆浆18禁一区二区三区| 精品无码一区二区三区电影| 国产精品丝袜一区二区三区 | 久久99精品国产一区二区三区| 无码日韩人妻AV一区免费l| 欧美日韩综合一区二区三区| 中文字幕一区在线观看视频| 亚洲天堂一区二区| 久久久久人妻精品一区蜜桃| 中文字幕无码一区二区免费| 中文字幕在线视频一区| 日韩av片无码一区二区三区不卡| 国产一区二区三区小向美奈子| 无码少妇A片一区二区三区| 中文字幕一区日韩精品| 国产精品久久久久一区二区三区| 亚洲Av无码国产一区二区| 亚洲a∨无码一区二区| 婷婷亚洲综合一区二区| 免费国产在线精品一区| 亚洲一区二区三区无码影院| 国产精品乱码一区二区三区| 久久精品一区二区影院 | 大帝AV在线一区二区三区| 亚洲国产精品无码第一区二区三区| 99无码人妻一区二区三区免费| 日韩AV无码久久一区二区| 91视频一区二区三区| 色国产在线视频一区| 乱人伦一区二区三区| 亚洲av无码一区二区三区不卡| 亚洲综合色一区二区三区小说| 中文字幕日韩一区二区不卡| 日韩精品一区二三区中文| 久久精品国产一区二区三区不卡|