zoukankan      html  css  js  c++  java
  • 不用再纠结反射影响效率了

    对于网上流传的“反射效率低”的说法,本人一直是相信的,这是动态和静态的区别,但反射到底影响多大程序一直没测试过,今天本着求是的态度做了个测试

    using System;
    using System.Diagnostics;
    using System.Reflection;
    
    class Program4
    {
        static void Main()
        {
            Assembly assembly = Assembly.GetExecutingAssembly();
            Module[] modules = assembly.GetModules(false);
            Type type = assembly.GetType("ThreadClass");
            MethodInfo mi = type.GetMethod("test");
    
            Stopwatch watch = new Stopwatch();
            watch.Start();
            for (int i = 0; i < 10000; i++)
            {
                ThreadClass.test();
            }
            watch.Stop();
            Console.WriteLine(watch.ElapsedTicks);
    
            watch.Restart();
            for (int i = 0; i < 10000; i++)
            {
                mi.Invoke(null, null);
            }
            watch.Stop();
            Console.WriteLine(watch.ElapsedTicks);
    
            Console.Read();
        }
    }
    
    class ThreadClass
    {
        public static void test()
        {
            //nothing
        }
    }
    

      

    要调用的方法里什么都不做,这样能更好地显示出“纯粹调用”的差距,结果打印:

    772
    9345

    从结果上来看,不到10000个ticks(10000个ticks相当于1毫秒),这说明纯粹的调用差别,一万次以上才会有一毫秒的误差,够小了吧,假设调用的方法里再做点事,这点差别根本忽略不计。

    这里要注意的是:调用之前已经获取到了MethodInfo,也许反射最大的性能问题应该在“加载程序集、获取类、获取方法信息”上,因此程序中只要在第一次调用时获取到MethodInfo,以后直接使用,根本没有什么效率的问题可以担心的,除非你傻到每次调用时都做“加载程序集、获取类、获取方法信息”这一系列动作。

    总结:只要提前获取到MethodInfo(确切的说是第一次,之后直接使用),10000次以上的调用才有1毫秒的误差,根本不存在效率的担心,放心地使用反射吧!

  • 相关阅读:
    php5.3连接sqlserver2005
    U盘文件名称变成乱码的解决方法
    sql小计汇总 rollup用法实例分析(转)
    关于document.all.item遇到IE8时无法正常取到数据
    jQuery 库中的 $() 是什么?
    JavaScript内置可用类型
    jquery中$.get()提交和$.post()提交有区别吗?
    什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
    说一说Servlet的生命周期?
    request.getAttribute()和 request.getParameter()有何区别?
  • 原文地址:https://www.cnblogs.com/yvesliao/p/2622411.html
Copyright © 2011-2022 走看看