日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
各大主流.Net的IOC框架性能測試比較

我簡單介紹過Autofac的使用,有人希望能有個性能上的測試,考慮到有那么多的IOC框架,而主流的有:Castle Windsor、微軟企業(yè)庫中的Unity、Spring.NET、StructureMap、Ninject等等。本篇文章主要針對這些IOC框架編寫測試程序。

我們提供的服務有:網(wǎng)站設計、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、義馬ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的義馬網(wǎng)站制作公司

Autofac下載地址:http://code.google.com/p/autofac/

Castle Windsor下載地址:http://sourceforge.net/projects/castleproject/files/Windsor/2.5/Castle.Windsor.2.5.3.zip/download

Unity下載地址:http://entlib.codeplex.com/

Spring.NET下載地址:http://www.springframework.net/

StructureMap下載地址:http://sourceforge.net/projects/structuremap/files/

Ninject下載地址:http://ninject.org/download

其中,測試程序均采用***的類庫。

基礎工作

1、程序還是引用上一篇的示例作為測試背景。

2、編寫一個性能計數(shù)器,這里我采用老趙寫的一個CodeTimer的類,具體介紹見:http://www.cnblogs.com/JeffreyZhao/archive/2009/03/10/codetimer.html

使用方式類似于:

 
 
 
 
  1. int iteration = 100 * 1000;string s = "";   
  2. CodeTimer.Time("String Concat", iteration, () => { s += "a"; });   
  3. StringBuilder sb = new StringBuilder();   
  4. CodeTimer.Time("StringBuilder", iteration, () => { sb.Append("a"); }); 

3、編寫一個IRunner運行接口:

 
 
 
 
  1. public interface IRunner   
  2. {   
  3.     void Start(RunType runType);   

以及RunnerBase抽象基礎運行類:

 
 
 
 
  1. public abstract class RunnerBase   
  2. {   
  3.     private int _iteration = Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings["Iteration"] ?? "10000");   
  4.     internal int Iteration   
  5.     {   
  6.         get { return _iteration; }   
  7.     }  
  8.     internal void Time(Action action)   
  9.     {   
  10.         CodeTimer.Time(Name, Iteration, action);   
  11.     }  
  12.     protected abstract string Name { get; }   
  13. }  

這里_iteration表示測試運行次數(shù),通過配置文件來設置值。Time方法通過計數(shù)器對action方法進行Iteration次迭代。

編寫一個RunManager的運行管理器:

 
 
 
 
  1. public class RunManager   
  2. {   
  3.     public static void Start(IRunner runner)   
  4.     {   
  5.         Start(runner, RunType.Transient);   
  6.     }  
  7.  
  8.     public static void Start(IRunner runner, RunType runType)   
  9.     {   
  10.         runner.Start(runType);   
  11.     }   

在測試中,我采用兩種方式的性能比較,一個是單例狀態(tài),一個是非單例狀態(tài):

 
 
 
 
  1. ///    
  2. /// 運行狀態(tài)   
  3. ///    
  4. public enum RunType   
  5. {   
  6.     ///    
  7.     /// 單例   
  8.     ///    
  9.     Singleton,  
  10.  
  11.     ///    
  12.     /// 瞬時   
  13.     ///    
  14.     Transient   
  15. }  

好了,現(xiàn)在我的程序只要繼承RunnerBase以及IRunnre接口,就可以實現(xiàn)各個IOC框架的初始化裝配的工作了?;A工作已經(jīng)做好。

#p#

各個IOC框架測試程序

1、Autofac:

 
 
 
 
  1. public class AutofacRunner : RunnerBase, IRunner   
  2. {   
  3.     protected override string Name   
  4.     {   
  5.         get { return "Autofac"; }   
  6.     }  
  7.  
  8.     public void Start(RunType runType)   
  9.     {   
  10.         var builder = new ContainerBuilder();  
  11.  
  12.         //if (runType == RunType.Singleton)   
  13.         //    builder.RegisterType().SingleInstance();   
  14.         //else   
  15.         //    builder.RegisterType();   
  16.         //builder.RegisterType().As();   
  17.         ////builder.RegisterModule(new ConfigurationSettingsReader("autofac"));  
  18.  
  19.         builder.RegisterType().As();   
  20.         if (runType == RunType.Singleton)   
  21.             builder.Register(c => new DatabaseManager(c.Resolve())).SingleInstance();   
  22.         else   
  23.             builder.Register(c => new DatabaseManager(c.Resolve()));    
  24.  
  25.         var container = builder.Build();  
  26.  
  27.         Time(() =>   
  28.         {   
  29.             var manager = container.Resolve();   
  30.             manager.Search("SELECT * FROM USER");   
  31.         });  
  32.  
  33.         container.Dispose();   
  34.     }   
  35. }  

2、Castle Windsor:

 
 
 
 
  1. public class WindsorRunner : RunnerBase, IRunner   
  2. {   
  3.     protected override string Name   
  4.     {   
  5.         get { return "Castle Windsor"; }   
  6.     }  
  7.  
  8.     public void Start(RunType runType)   
  9.     {   
  10.         var container = new WindsorContainer();   
  11.         if(runType == RunType.Singleton)   
  12.             container.Register(Component.For(typeof(DatabaseManager)).LifeStyle.Singleton);   
  13.         else   
  14.             container.Register(Component.For(typeof(DatabaseManager)).LifeStyle.Transient);  
  15.  
  16.         container.Register(Component.For(typeof(IDatabase)).ImplementedBy(typeof(SqlDatabase)));  
  17.  
  18.         Time(() =>   
  19.         {   
  20.             var manager = container.Resolve();   
  21.             manager.Search("SELECT * FROM USER");   
  22.         });   
  23.     }   
  24. }  

3、Unity:

 
 
 
 
  1. public class UnityRunner : RunnerBase, IRunner   
  2. {   
  3.     protected override string Name   
  4.     {   
  5.         get { return "Unity"; }   
  6.     }  
  7.  
  8.     public void Start(RunType runType)   
  9.     {   
  10.         var container = new UnityContainer();   
  11.         if(runType == RunType.Singleton)   
  12.             container.RegisterType(new ContainerControlledLifetimeManager());   
  13.         else   
  14.             container.RegisterType(new TransientLifetimeManager());   
  15.         container.RegisterType();  
  16.  
  17.         Time(() =>   
  18.             {   
  19.                 var manager = container.Resolve();   
  20.                 manager.Search("SELECT * FROM USER");   
  21.             });   
  22.     }   
  23. }  

4、Spring.NET:

 
 
 
 
  1. public class SpringRunner : RunnerBase, IRunner   
  2. {   
  3.     protected override string Name   
  4.     {   
  5.         get { return "Spring.NET"; }   
  6.     }  
  7.  
  8.     public void Start(RunType runType)   
  9.     {   
  10.         string databaseManagerName;   
  11.         if (runType == RunType.Singleton)   
  12.             databaseManagerName = "DatabaseManager_Singleton";   
  13.         else   
  14.             databaseManagerName = "DatabaseManager_Transient";  
  15.  
  16.         Time(() =>   
  17.         {   
  18.             IApplicationContext context = ContextRegistry.GetContext();   
  19.             var manager = (DatabaseManager)context.GetObject(databaseManagerName);   
  20.             manager.Search("SELECT * FROM USER");   
  21.         });   
  22.     }   
  23. }  

5、StructureMap:

 
 
 
 
  1. public class StructureMapRunner : RunnerBase, IRunner   
  2. {   
  3.     protected override string Name   
  4.     {   
  5.         get { return "StructureMap"; }   
  6.     }  
  7.  
  8.     public void Start(RunType runType)   
  9.     {   
  10.         ObjectFactory.Initialize(container =>   
  11.         {   
  12.             if (runType == RunType.Singleton)   
  13.                 container.ForRequestedType().Singleton();   
  14.             else   
  15.                 container.ForRequestedType();   
  16.             container.ForRequestedType().TheDefaultIsConcreteType();   
  17.         });  
  18.  
  19.         Time(() =>   
  20.             {   
  21.                 var manager = ObjectFactory.GetInstance();   
  22.                 manager.Search("SELECT * FROM USER");   
  23.             });   
  24.     }   
  25. }  

6、Ninject:

 
 
 
 
  1. public class NinjectRunner : RunnerBase, IRunner   
  2. {   
  3.     protected override string Name   
  4.     {   
  5.         get { return "Ninject"; }   
  6.     }  
  7.  
  8.     public void Start(RunType runType)   
  9.     {   
  10.         IKernel kernel = new StandardKernel(new MyNinjectModule(runType));  
  11.  
  12.         Time(() =>   
  13.         {   
  14.             var manager = kernel.Get();   
  15.             manager.Search("SELECT * FROM USER");   
  16.         });   
  17.     }   
  18. }  

客戶端測試程序

 
 
 
 
  1. static void Main(string[] args)   
  2. {   
  3.     CodeTimer.Initialize();  
  4.  
  5.     Console.WriteLine("IOC - Singleton");   
  6.     // Autofac Singleton   
  7.     RunManager.Start(new AutofacRunner(), RunType.Singleton);          
  8.     // Castle Windsor   
  9.     RunManager.Start(new WindsorRunner(), RunType.Singleton);   
  10.     // Unity   
  11.     RunManager.Start(new UnityRunner(), RunType.Singleton);   
  12.     // Spring.NET   
  13.     RunManager.Start(new SpringRunner(), RunType.Singleton);   
  14.     // StructureMap   
  15.     RunManager.Start(new StructureMapRunner(), RunType.Singleton);   
  16.     // Ninject   
  17.     RunManager.Start(new NinjectRunner(), RunType.Singleton);  
  18.  
  19.     Console.WriteLine("===================================");   
  20.     Console.WriteLine("IOC - Transient");   
  21.     // Autofac Singleton   
  22.     RunManager.Start(new AutofacRunner(), RunType.Transient);   
  23.     // Castle Windsor   
  24.     RunManager.Start(new WindsorRunner(), RunType.Transient);   
  25.     // Unity   
  26.     RunManager.Start(new UnityRunner(), RunType.Transient);   
  27.     // Spring.NET   
  28.     RunManager.Start(new SpringRunner(), RunType.Transient);   
  29.     // StructureMap   
  30.     RunManager.Start(new StructureMapRunner(), RunType.Transient);   
  31.     // Ninject   
  32.     RunManager.Start(new NinjectRunner(), RunType.Transient);  
  33.  
  34.     Console.ReadKey();   
  35. }  

通過修改App.config的Iteration配置值,來設置迭代次數(shù)。

 
 
 
 
  1.    
  2.      
  3.   

運行結果

1、Iteration=1000:

分析:在千數(shù)量級時,Autofac,CastleWindsor、StructureMap基本差不多,效率上比其他的要高。

2、Iteration=10000:

分析:在萬數(shù)量級時,Autofac,CastleWindsor,StructureMap基本效率還是差不多,其中StructureMap效率稍稍有些下降;Spring.NET以及Ninject的性能比較低。

3、Iteration=100000:

分析:在十萬數(shù)量級時,CastleWindsor的效率開始下降,而在Transient方面,StructureMap和Autofac基本差不多。

4、Iteration=1000000:

分析:在百萬數(shù)量級時,Autofac和StructureMap兩者還是保持比較高的效率,并且在Transient方面,StructureMap已經(jīng)超過了Autofac。

總結:從測試中,可以看出Autofac和StructureMap在性能上面還是體現(xiàn)出比較大的優(yōu)勢,Ninject可以說性能上較低。而Spring.NET不僅僅專注于IOC方面,它還專注于其他方方面面的功能,所以在IOC方面的性能不是太高。另外,微軟的Unity中規(guī)中矩,性能較為穩(wěn)定,也是一個不錯的選擇。另外,可能測試程序會有所偏差,希望大家也能夠指出問題!

測試程序源代碼:IOCPerformanceTest.rar

原文:http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html


網(wǎng)站欄目:各大主流.Net的IOC框架性能測試比較
文章路徑:http://www.5511xx.com/article/dhjodoe.html