C# 反射性能


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是一件很耗时间的过程




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值