2011-06-01 97 views
3

因为我已经创建了统一基本呈现以下控制台应用程序(有点冗长)的一部分:UnityContainer性能测试结果

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使用通常的双重检查锁定。
  • SingletonWithUnity也只是一个空的类,但你可以看到它已经在ContainerControlleredLifetimeManager中注册了。

我得到的结果是N越高(高达100万),表明使用统一性实际上要慢得多,不使用它。我曾经认为Unity有某种形式的缓存缓存,可以让它更快,特别是在瞬态解决方案中。

下面是运行时,N被设置为10,000性能测试应用的结果的一个例子:

的基本新对象基本新对象 平均时间

测试服务表现为:0.0007

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

基本单例测试性能 基本si的平均时间ngleton是:团结单身的统一单 平均时间0.0012

测试表现为:0.0033

按任意键继续。 。 。

正如你可以看到使用Unity是一个性能影响。 我想在幕后解释这些结果的真实意见。

在此先感谢!

回答

7

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

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

+1

我不认为它是用来增加对象的创建。但我对这些结果的幅度感到非常惊讶,因此我正在寻找解释为什么会发生这些结果 – JarJarrr 2011-06-01 07:46:37

+4

不够公平。我想我不能回答关于具体的数量差异(虽然我认为额外的间接水平是负责任的)。您可能想尝试使用秒表,而不是DateTime.Now中的差异,因为分辨率会更高。 – dlev 2011-06-01 07:51:12

0

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

+0

统一解决方案导致我们的应用程序从9个问题解决9s瓶颈。我认为这个人是在问他是否有类似的问题,并试图找出如何处理它。像我这样的。 – THEMike 2012-09-20 10:39:20