现在的位置: 首页 > 综合 > 正文

dynamic做反射提升性能

2013年10月14日 ⁄ 综合 ⁄ 共 1239字 ⁄ 字号 评论关闭

今天比较没有事情,突然想做个关于dyanmic对象和使用反射的性能比较,所以就做了个简单的测试。

第一中方法是传统的调用

第二种方法是使用daynamic对象

第三种方法是使用反射

分别调用List<>的Add方法1000000次,看看每种方法耗用的时间。 

using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ConsoleApplication2
{
    class Test
    {
        public string Name { get; set; }
        public int Aage { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //直接调用
            var list = new List<Test>();
            var sw = new Stopwatch();
            sw.Start();
            for (var i = 0; i < 1000000; i++) list.Add(new Test() { Name = "Test", Aage = i });
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds.ToString());

            var type = typeof(List<>);
            var gType = type.MakeGenericType(typeof(Test));

            //动态调用
            dynamic dynamicObject = Activator.CreateInstance(gType);
            sw.Reset();
            sw.Restart();
            for (var i = 0; i < 1000000; i++) dynamicObject.Add(new Test() { Name = "Test", Aage = i });
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds.ToString());

            //反射
            var obj = Activator.CreateInstance(gType);
            var m = gType.GetMethod("Add");
            sw.Reset();
            sw.Restart();
            for (var i = 0; i < 1000000; i++) m.Invoke(obj, new object[] { new Test() { Name = "Test", Aage = i } });
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds.ToString());
            Console.ReadKey();
        }
    }
}

 

 

结果如下:

结果显示,相对于传统的方法,使用dynamic要慢3倍,使用反射要慢30倍

====================

0.codedom,将语言codedom文本,首次运行编译并生成dll,然后加载调用相当于js中的eval()1.反射和反射发送:在元数据中找,然后调用,反射缓存,延迟绑定(即调用时绑定)
2.调用:直接调用
3.动态,DLR

 

 

抱歉!评论已关闭.