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
     
    但还是有一点点的影响,不过比起之前已经可以忽略不计了。
  • 相关阅读:
    如何在Ubuntu上安装Wine 2.6
    51nod 1012 最小公倍数LCM
    二次urldecode注入
    CTF中的变量覆盖问题
    redis的bind误区
    宽字节注入原理
    PHP靶场-bWAPP环境搭建
    xxe-lab学习
    PHP代码审计之create_function()函数
    SSRF打认证的redis
  • 原文地址:https://www.cnblogs.com/faib/p/3164043.html
Copyright © 2011-2022 走看看