zoukankan      html  css  js  c++  java
  • 由优化反射性能问题引发的思考

    看了几篇大神们的文章:

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

  • 相关阅读:
    HDU1294 Rooted Trees Problem(整数划分 组合数学 DP)
    HDU2546 饭卡(背包)
    经典动态规划总结
    POJ1285 Combinations, Once Again(背包 排列组合)
    计数 组合数学总结
    莫队算法 2038: [2009国家集训队]小Z的袜子(hose)
    循环-24. 求给定序列前N项和之二
    循环-23. 找完数
    循环-22. 输出闰年
    循环-21. 求交错序列前N项和
  • 原文地址:https://www.cnblogs.com/passer/p/2958646.html
Copyright © 2011-2022 走看看