完善主體資料,免費(fèi)贈送VIP會員!
    * 主體類型
    * 企業(yè)名稱
    * 信用代碼
    * 所在行業(yè)
    * 企業(yè)規(guī)模
    * 所在職位
    * 姓名
    * 所在行業(yè)
    * 學(xué)歷
    * 工作性質(zhì)
    請先選擇行業(yè)
    您還可以選擇以下福利:
    行業(yè)福利,領(lǐng)完即止!

    下載app免費(fèi)領(lǐng)取會員

    NULL

    ad.jpg

    二次開發(fā)教程:C# 反射性能

    發(fā)布于:2019-07-24 16:46:41

    網(wǎng)友投稿

    更多

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


    這里可以比較一下,構(gòu)造方法帶參數(shù)和不帶參數(shù)的區(qū)別。


    先創(chuàng)建一個(gè)測試類,分為構(gòu)造函數(shù)帶參數(shù)和不帶參數(shù),兩種情況來測試


        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();

            }

        }




    發(fā)現(xiàn)使用Assembly.CreateInstance是最慢的,使用new 是最快的


    當(dāng)構(gòu)造函數(shù)帶參數(shù)的時(shí)候,ConstructorInfo.Invoke是第二快的


    當(dāng)構(gòu)造函數(shù)不帶參數(shù)的時(shí)候Activator.CreateInstance是第二快的,


    查看Assembly.CreateInstance的源碼,發(fā)現(xiàn)他在內(nèi)部是用Activator.CreateInstance創(chuàng)建的,但是多了一個(gè)尋找Type的過程,


    似乎尋找Type是一件很耗時(shí)間的過程

    本文版權(quán)歸腿腿教學(xué)網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權(quán),謝絕轉(zhuǎn)載。

    未標(biāo)題-1.jpg

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

    下一篇:關(guān)于revit中2D軸網(wǎng)與3D的區(qū)別

    60acb4e0ef112.png
    主站蜘蛛池模板: 国产精品乱码一区二区三| 麻豆视频一区二区三区| 亚洲色精品三区二区一区| 一区二区三区四区在线视频| 久久精品一区二区国产| 亚洲丰满熟女一区二区v| 无码精品人妻一区| 久久久久国产一区二区 | 日本中文字幕在线视频一区| 久久精品亚洲一区二区三区浴池| av无码精品一区二区三区四区 | 成人精品一区久久久久| 在线观看一区二区精品视频| 一本大道东京热无码一区| 丰满人妻一区二区三区免费视频 | 国产人妖在线观看一区二区| 亚洲一区二区三区在线| 精品无码国产一区二区三区AV| 国产精品高清一区二区三区| 国产AⅤ精品一区二区三区久久 | 亚洲色无码一区二区三区| 中文字幕一区日韩在线视频| 一级特黄性色生活片一区二区| 国产一区在线播放| 精品无码成人片一区二区| 日韩精品一区二区三区在线观看l| 无码一区二区三区AV免费| 精品国产一区二区三区| 国产成人久久一区二区不卡三区| 亚洲欧洲日韩国产一区二区三区| 亚洲第一区二区快射影院| 一本一道波多野结衣AV一区| 久久青青草原一区二区| 国产一区二区三区美女| 杨幂AV污网站在线一区二区| 亚洲国产成人久久一区久久| 国产一区二区三区91| 精品一区二区三区在线观看视频| 国产对白精品刺激一区二区| 在线观看精品一区| 综合久久一区二区三区|