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
     
    但还是有一点点的影响,不过比起之前已经可以忽略不计了。
  • 相关阅读:
    队列数据结构与算法JavaScript描述(5)
    栈数据结构与算法Javascript描述(4)
    散列数据结构与算法JavaScript描述(8)
    Evevt Loop、任务队列、定时器等
    OSGi初始篇
    应用服务平台与应用服务器
    数据源相关规范整理
    新手入门:教您最优的J2EE学习经验和流程
    TableView的使用
    Strategy
  • 原文地址:https://www.cnblogs.com/faib/p/3164043.html
Copyright © 2011-2022 走看看