UnityContainer性能测试结果

时间:2011-06-01 07:34:07

标签: c# performance unity-container console-application

作为团结基本演示的一部分,我创建了以下控制台应用程序(有点冗长):

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设置为10,000时运行性能测试应用程序的结果示例:

  

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

     

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

     

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

     

测试统一单身人士的表现   统一单身的平均时间是:0.0033

     

按任意键继续。 。

正如您所看到的,使用Unity会对性能产生影响。 我想就你在幕后发生的事情得到你的诚实意见,以解释这些结果。

提前致谢!

2 个答案:

答案 0 :(得分:7)

请记住,Unity必须为界面找到合适的具体类,然后然后如果找到它,就构建它。即使缓存解决方案也不会改变这样一个事实,即只需要自己修改对象就可以进行额外的方法调用和(可能是缓存的)查找。

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

答案 1 :(得分:-1)

提供理论解释可能很有意思,但在实践中,这绝不会成为问题。我很难想象解决你的课程是你课程的瓶颈。 您应该只在必要时提高性能,而不是事先提高性能!