zoukankan      html  css  js  c++  java
  • 注意Activator.CreateInstance两个重载方法的性能

    今天扩展一个Type的扩展方法New:

            public static object New(this Type type, params object[] args)
            {
                Guard.ArgumentNull(type, "type");
                return Activator.CreateInstance(type, args);
            }

    然后想到了测试一下其性能,所以就和直接使用Activator.CreateInstance方法作一下比较:

            public void TestCreateInstance()
            {
                Console.WriteLine(TimeWatcher.Watch(() =>
                    {
                        for (var i = 0; i < 10000; i++)
                        {
                            var o = Activator.CreateInstance(typeof(TestSerializeClass1));
                        }
                    }));
                Console.WriteLine(TimeWatcher.Watch(() =>
                {
                    for (var i = 0; i < 10000; i++)
                    {
                        var o = typeof(TestSerializeClass1).New();
                    }
                }));
            }

    这似乎是多此一举的无用测试,却着实使我大吃一惊!

    00:00:00.0015076
    00:00:00.0104130
     
    为什么发生了如此大的变化,不就是没有指定第二个参数么!!
    使用Reflector查看Activator.CreateInstance(Type type) 和 Activator.CreateInstance(Type type, params object[] args) 方法,发现它们的实现都不一样,但具体慢在什么地方,暂时还没有时间去分析。
    因此,在写公共类库的时候,性能测试是必须的,尤其是使用反射的情况下,更是要注意这样的陷阱。
     
    修改后的New方法如下:
            public static object New(this Type type, params object[] args)
            {
                Guard.ArgumentNull(type, "type");
                if (args == null || args.Length == 0)
                {
                    return Activator.CreateInstance(type);
                }
    
                return Activator.CreateInstance(type, args);
            }

    再次测试的时间如下:

    00:00:00.0016531
    00:00:00.0020176
     
    但还是有一点点的影响,不过比起之前已经可以忽略不计了。
  • 相关阅读:
    第十二讲 Web 服务的创建和使用
    第十七讲 ASP.NET安全性
    第九讲 水晶报表的使用
    第十五讲 数据集的使用方法和技巧
    第十六讲 调试和跟踪ASP.NET应用程序
    第十讲 ASP.NET程序的部署
    第十四讲 ADO.NET数据操作
    第十八讲 Web服务器控件使用
    【笔记】java多线程 2 五种状态
    【笔记】数据库模式
  • 原文地址:https://www.cnblogs.com/faib/p/3164043.html
Copyright © 2011-2022 走看看