快速反射读写对象属性,字段 Literacy

未知
C#
Windows
2014-11-17
红薯

Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多

当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但不能提高性能,反而会使性能下降,所以使用场合需要自己把握

下面是在我的电脑上做的一些测试(因机器配置不同会有少许误差)

测试次数 Literacy 反射
10 16ms 0ms
100 15ms 0ms
1K 16ms 5ms
1W 16ms 50ms
10W 23ms 505ms
100W 87ms 5149ms

示例代码:

static void Main(string[] args)
{
    User u = new User();
    CodeTimer.Initialize();
    CodeTimer.Time("MethodInfo", 1000000, () => GetName2(u));
    CodeTimer.Time("Literacy", 1000000, () => GetName(u));
    CodeTimer.Time("dynamic", 1000000, () => GetName3(u));
}

static ObjectProperty prop;

public static object GetName(object obj)
{
    if (obj == null) throw new ArgumentNullException("obj");
    if (prop == null)
    {
        prop = new Literacy(obj.GetType()).Property["Name"];
        if (prop == null) throw new NotSupportedException("对象不包含Name属性");
    }
    return prop.GetValue(obj);
}

static MethodInfo getName;

public static object GetName2(object obj)
{
    if (obj == null) throw new ArgumentNullException("obj");
    if (getName == null)
    {
        getName = obj.GetType().GetProperty("Name").GetGetMethod();
    }
    return getName.Invoke(obj, null); //缓存了反射Name属性
}

public static object GetName3(object obj)
{
    if (obj == null) throw new ArgumentNullException("obj");
    return ((dynamic)obj).Name;
}
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

推荐:制作地图的网站和工具

推荐:制作地图的网站和工具 RECOMMENDED SITES AND TOOLS FOR MAPPING AJD GEOSPATIAL CONCEPTS http://gisconsultingservices.com/ AJD Geospatial Concepts specializes in the organizat...

2016/10/31 13:31
39
0
causing outrage No shake

causing outrage No shake

2015/06/05 13:15
5
0
Carolina Law Enforcement

Carolina Law Enforcement

2015/06/02 13:12
3
0
Expresso - A Tool for Building and Testing Regular Expressions

Download Installation File - 88 Kb Download Source Code - 91 Kb Introduction The .NET framework provides a powerful class Regex for creating and using Regular Expressions. While...

2011/02/07 21:01
176
0
我希望Ruby程序员一年前就告诉我

翻译 : What I wish a Ruby programmer had told me one year ago

2013/11/14 10:51
79
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部