完善主體資料,免費贈送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的區別

      主站蜘蛛池模板: 亚洲熟妇无码一区二区三区| 夜色阁亚洲一区二区三区| 无码国产亚洲日韩国精品视频一区二区三区 | 国产一区二区三区美女| 日本在线一区二区| 国产激情一区二区三区 | 成人精品一区二区激情| 99精品国产一区二区三区2021| 日本一区二区三区高清| 精品国产一区二区三区久久蜜臀 | 视频在线观看一区二区三区| 亚洲一区免费在线观看| 国产精品毛片VA一区二区三区| 国产福利电影一区二区三区,日韩伦理电影在线福 | 日本一区中文字幕日本一二三区视频| 国产综合一区二区| 亚洲AV无码一区二区二三区软件 | 无码精品人妻一区二区三区人妻斩| 一区二区三区福利| 国产伦精品一区二区免费| 无码欧精品亚洲日韩一区夜夜嗨| 国产日韩综合一区二区性色AV| 午夜性色一区二区三区不卡视频 | 精品国产AV无码一区二区三区 | 国产一在线精品一区在线观看| 视频一区二区中文字幕| 亚洲熟女乱综合一区二区| 精品国产一区二区三区在线观看| 一区二区三区福利视频| 国产免费一区二区三区在线观看| 国产成人无码一区二区三区在线 | 在线电影一区二区三区| 精品视频在线观看一区二区三区| 日本美女一区二区三区 | 人妻体体内射精一区二区| 精品视频无码一区二区三区| 影音先锋中文无码一区| 国产人妖视频一区在线观看| 一区二区三区精品视频| 国产精品日本一区二区不卡视频 | 好湿好大硬得深一点动态图91精品福利一区二区 |