UnityContainer Performance测试结果

| 作为有关统一性的基本介绍的一部分,我创建了以下控制台应用程序(有点长):
IUnityContainer container = new UnityContainer();
        container.RegisterType<ISimpleClass, SimpleClass>();
        container.RegisterType<ISingletonWithUnity, SingletonWithUnity>(new ContainerControlledLifetimeManager());

        double N = 10000;
        double sum = 0;

        Console.WriteLine(\"Testing performace of a basic new object\");
        for (int i = 0; i < N; i++)
        {
            DateTime start = DateTime.Now;
            ISimpleClass simpleClass = new SimpleClass();
            DateTime end = DateTime.Now;
            sum += (end - start).Milliseconds;
        }
        double average = sum/N;
        Console.WriteLine(\"Average time for basic new object is: \" + average);


        Console.WriteLine(\"Testing performance of transient resolve using unity\");
        sum = 0;
        for (int i = 0; i < N; i++)
        {
            DateTime start = DateTime.Now;
            ISimpleClass simpleClass = container.Resolve<SimpleClass>();
            DateTime end = DateTime.Now;
            sum += (end - start).Milliseconds;
        }
        average = sum / N;

        Console.WriteLine(\"Average time for transient resolve using unity is: \" + average);


        Console.WriteLine(\"Testing performance of basic singleton\");
        sum = 0;
        for (int i = 0; i < N; i++)
        {
            DateTime start = DateTime.Now;
            BasicSingltonClass basicSingltonClass = BasicSingltonClass.Instance;
            DateTime end = DateTime.Now;
            sum += (end - start).Milliseconds;
        }
        average = sum / N;

        Console.WriteLine(\"Average time for basic singleton is: \" + average);

        Console.WriteLine(\"Testing performance of unity singleton\");
        sum = 0;
        for (int i = 0; i < N; i++)
        {
            DateTime start = DateTime.Now;
            SingletonWithUnity singletonWithUnity = container.Resolve<SingletonWithUnity>();
            DateTime end = DateTime.Now;
            sum += (end - start).Milliseconds;
        }
        average = sum / N;

        Console.WriteLine(\"Average time for unity singleton is: \" + average);
测试中使用的类非常简单: SimpleClass只是一个空类 BasicSingletonClass正是使用实例getter上的常规Double Checked Locking进行的操作。 SingletonWithUnity也是一个空类,但是您可以看到它是在ContainerControlleredLifetimeManager中注册的。 随着N的增加(达到一百万),我得到的结果表明使用统一实际上比不使用统一要慢得多。我曾经认为Unity具有某种形式的解析缓存,因此可以使其更快得多,尤其是在瞬态解析中。 这是当N设置为10,000时运行性能测试应用程序的结果的示例:   测试基本新对象的性能   基本新对象的平均时间为:0.0007      使用unity测试瞬态解析的性能   使用单位进行瞬态解析的平均时间为:0.008      基本单例测试性能   基本单身人士的平均时间为:0.0012      测试单身人士的表现   单身人士的平均时间是:0.0033      按任意键继续 。 。 。 如您所见,使用Unity会对性能产生影响。 我想就您在幕后发生的事情获得您的诚实意见,以解释这些结果。 提前致谢!     
已邀请:
        请记住,Unity必须为接口找到适当的具体类,然后如果找到它,则对其进行构造。即使是缓存解析器,也不会改变这样的事实:存在一个额外的方法调用和(可能是缓存的)查找,而不仅仅是您自己更新对象。 Unity并非真正旨在提高对象创建性能。它旨在提供一个强大的DI容器,该容器可以帮助减少耦合并简化代码测试。     
        进行理论解释也许很有趣,但是在实践中这永远不会成为问题。我很难想象解决类是程序中的瓶颈。 仅在必要时才应提高性能,而不是事前!     

要回复问题请先登录注册