UnityContainer性能测试结果

本文关键字:测试结果 性能 UnityContainer | 更新日期: 2023-09-27 17:58:12

作为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正是在实例getter上使用通常的Double-Checked Locking的情况
  • SingletonWithUnity也是一个空类,但正如您所看到的,它是在ContainerControlleredLifetimeManager中注册的

随着N的增加(高达100万),我得到的结果表明,使用unity实际上比不使用它慢得多。我曾经认为unity有某种解析缓存,这样可以使它更快,尤其是在瞬态解析中。

以下是当N设置为10000:时运行性能测试应用程序的结果示例

测试基本新对象的性能基本新对象的平均时间为:0.0007

使用unity测试瞬态分辨性能使用单位进行瞬态解析的平均时间为:0.008

测试基本单例的性能基本单例的平均时间为:0.0012

unity singleton的测试性能统一单例的平均时间为:0.0033

按任意键继续。

正如您所看到的,使用Unity会对性能产生影响。我想听听你对幕后发生的事情的真实看法,来解释这些结果。

提前感谢!

UnityContainer性能测试结果

请记住,Unity必须为接口找到合适的具体类,然后如果找到它,就构造它。即使缓存解析也不会改变这样一个事实,即存在额外的方法调用和(可能缓存的)查找,而只是自己新建对象。

Unity实际上并不是为了提高对象创建性能。它旨在提供一个健壮的DI容器,可以帮助减少耦合并简化代码测试。

也许给出一个理论解释很有趣,但在实践中这永远不会成为问题。我很难想象解决你的类是你程序中的瓶颈。你应该只在必要的时候提高性能,而不是事先!