UnityContainer 性能测试结果

3
作为Unity基础介绍的一部分,我创建了以下控制台应用程序(有点冗长):
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使用通常的双重检查锁定实现单例模式。 - SingletonWithUnity也只是一个空的类,但它被注册在ContainerControlleredLifetimeManager中。
当N越来越高(达到100万)时,我得到的结果表明使用Unity比不使用Unity要慢得多。我曾经认为Unity有一些解析缓存等内容使它更快,特别是在瞬态解析方面。
这是运行性能测试应用程序并将N设置为10,000时的示例结果:
- 测试创建基本对象的性能 基本对象的平均时间为:0.0007 - 测试使用Unity进行瞬态解析的性能 使用Unity进行瞬态解析的平均时间为:0.008 - 测试基本单例的性能 基本单例的平均时间为:0.0012 - 测试Unity单例的性能 Unity单例的平均时间为:0.0033
正如您所看到的,使用Unity会对性能产生影响。我想听听您对背后的情况有何看法以解释这些结果。
提前感谢您!
2个回答

7

请注意,Unity必须找到与接口相对应的适当具体类,然后构造它。即使缓存解析结果,也无法改变一个额外方法调用和(可能是已缓存的)查找,而只是自己新建对象。

Unity并不真正意在提高对象创建性能。它的目的是提供一个强大的DI容器,可以帮助减少耦合并简化代码测试。


1
我并没有认为这是为了增加对象创建而设计的。但是我对这些结果的巨大程度感到非常惊讶,因此我正在寻找一个解释,为什么会出现这些结果。 - JarJarrr
4
好的,我想我不能回答关于具体差异的问题(尽管我认为额外的间接层是有责任的)。您可能希望尝试使用Stopwatch而不是DateTime.Now中的差异,因为分辨率会更高。 - dlev

-1
也许在理论上解释很有趣,但实际上这永远不会成为问题。我几乎无法想象解决类的问题会成为程序的瓶颈。 只有在必要时才应该提高性能,而不是事先!

Unity分辨率在我们的应用程序中导致了9秒的瓶颈,需要解决36个调用。我认为这个人正在询问,因为他有类似的问题,并尝试弄清楚该怎么做。就像我一样。 - THEMike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接