• 由优化反射性能问题引发的思考


    看了几篇大神们的文章:

    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秒的优化效果吗?

  • 相关阅读:
    实现RHEL下KVM虚拟化
    SELinux安全扩展
    配置用户和组信息
    系统级计划任务
    syslog系统日志服务
    VNC远程连接,虚拟网络计算
    系统初始化
    备份与还原文件系统
    使用对象在方法间共享属性
    Python中*和**的使用
  • 原文地址:https://www.cnblogs.com/passer/p/2958646.html
Copyright © 2020-2023  润新知