完善主體資料,免費贈送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无码一区二区三区| 日本一区二区在线不卡| 日韩精品区一区二区三VR | 亚洲爆乳精品无码一区二区| 国产观看精品一区二区三区| 亚洲福利视频一区| 国产一区二区在线|播放| 久久国产精品无码一区二区三区| 国产成人一区二区三区精品久久 | 日韩一区二区三区精品| 无码人妻品一区二区三区精99| 日本免费电影一区| 国产福利一区二区三区| 中文字幕日本精品一区二区三区| 精品人妻少妇一区二区三区不卡| 国精品无码一区二区三区左线| 国模极品一区二区三区| 在线播放国产一区二区三区| 成人无码一区二区三区| 后入内射国产一区二区| 人妻视频一区二区三区免费 | 国产成人精品一区在线| 亚洲AV无码国产一区二区三区 | 欧美日本精品一区二区三区| 久久99精品一区二区三区| 在线精品亚洲一区二区三区| 无码8090精品久久一区| 国产在线观看一区二区三区四区 | 国产午夜精品免费一区二区三区 | 日韩精品一区二三区中文| 国产精品久久一区二区三区| 亚洲av鲁丝一区二区三区| 亚洲av无码不卡一区二区三区| 国产成人精品一区二区三区无码 | 久久毛片免费看一区二区三区|