2011-06-01 103 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