看了几篇大神们的文章:
http://www.cnblogs.com/fish-li/archive/2013/02/18/2916253.html
http://www.cnblogs.com/JeffreyZhao/archive/2008/11/24/1338682.html
http://www.codeproject.com/Articles/14593/A-General-Fast-Method-Invoker
我总结出的结论:最好的优化情况下可以提升1-2个数量级(10-100倍)的性能 具体来说大概是100万次反射 可以优化出大概0.0x-0.x秒的性能。
好吧 看起来优化一点也是优化吧!
但是得出这些结论的前提是构造委托代理的时间没有计算在总耗费时间在内,大家可能会说这个可以重用啊,构建一次缓存即可。
现在问题来了,缓存的性能也是有开销的。特别是并发环境下是有不小代价的。
我大概测试了一下单线程的Dictionary缓存的性能。
static Dictionary<MethodInfo, FastInvokeHandler> dic = new Dictionary<MethodInfo, FastInvokeHandler>(); public static object FastInvoke(this MethodInfo methodInfo, object target, object[] paramters) { if (!dic.ContainsKey(methodInfo)) { var mi = GetMethodInvoker(methodInfo); lock (lockObj) { dic[methodInfo] = mi; } } return dic[methodInfo].Invoke(target, paramters); }
单线程100万次的以上的 ContainsKey 和[]操作就有0.0x-0.x秒的性能开销 ,我也尝试过HashTable 最终无解。
最终实践整体重用优化的结果就是效果很不明显,优化出来的反射性能又被其它地方增加的开销抵消了,而且带来并发问题。我的结论是更本不需要优化。你的系统真的有上1000万的反射调用频率吗,真的在乎1000万的反射提升1秒的优化效果吗?