您所在的位置:开发 > .NET > 各大主流.Net的IOC框架性能测试比较(2)

各大主流.Net的IOC框架性能测试比较(2)

2011-07-19 09:35 Leepy Leepy的博客 字号:T | T
一键收藏,随时查看,分享好友!

我简单介绍过Autofac的使用,有人希望能有个性能上的测试,考虑到有那么多的IOC框架,而主流的有:Castle Windsor、微软企业库中的Unity、Spring.NET、StructureMap、Ninject等等。本篇文章主要针对这些IOC框架编写测试程序。

AD:

各个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<DatabaseManager>().SingleInstance();   
  14.         //else   
  15.         //    builder.RegisterType<DatabaseManager>();   
  16.         //builder.RegisterType<SqlDatabase>().As<IDatabase>();   
  17.         ////builder.RegisterModule(new ConfigurationSettingsReader("autofac"));  
  18.  
  19.         builder.RegisterType<SqlDatabase>().As<IDatabase>();   
  20.         if (runType == RunType.Singleton)   
  21.             builder.Register(c => new DatabaseManager(c.Resolve<IDatabase>())).SingleInstance();   
  22.         else   
  23.             builder.Register(c => new DatabaseManager(c.Resolve<IDatabase>()));    
  24.  
  25.         var container = builder.Build();  
  26.  
  27.         Time(() =>   
  28.         {   
  29.             var manager = container.Resolve<DatabaseManager>();   
  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<DatabaseManager>();   
  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<DatabaseManager>(new ContainerControlledLifetimeManager());   
  13.         else   
  14.             container.RegisterType<DatabaseManager>(new TransientLifetimeManager());   
  15.         container.RegisterType<IDatabase, SqlDatabase>();  
  16.  
  17.         Time(() =>   
  18.             {   
  19.                 var manager = container.Resolve<DatabaseManager>();   
  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<DatabaseManager>().Singleton();   
  14.             else   
  15.                 container.ForRequestedType<DatabaseManager>();   
  16.             container.ForRequestedType<IDatabase>().TheDefaultIsConcreteType<SqlDatabase>();   
  17.         });  
  18.  
  19.         Time(() =>   
  20.             {   
  21.                 var manager = ObjectFactory.GetInstance<DatabaseManager>();   
  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<DatabaseManager>();   
  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配置值,来设置迭代次数。

  1. <appSettings>   
  2.   <add key="Iteration" value="100000" />   
  3. </appSettings>  

运行结果

1、Iteration=1000:

image

分析:在千数量级时,Autofac,CastleWindsor、StructureMap基本差不多,效率上比其他的要高。

2、Iteration=10000:

image

分析:在万数量级时,Autofac,CastleWindsor,StructureMap基本效率还是差不多,其中StructureMap效率稍稍有些下降;Spring.NET以及Ninject的性能比较低。

3、Iteration=100000:

image

分析:在十万数量级时,CastleWindsor的效率开始下降,而在Transient方面,StructureMap和Autofac基本差不多。

4、Iteration=1000000:

image

分析:在百万数量级时,Autofac和StructureMap两者还是保持比较高的效率,并且在Transient方面,StructureMap已经超过了Autofac。

总结:从测试中,可以看出Autofac和StructureMap在性能上面还是体现出比较大的优势,Ninject可以说性能上较低。而Spring.NET不仅仅专注于IOC方面,它还专注于其他方方面面的功能,所以在IOC方面的性能不是太高。另外,微软的Unity中规中矩,性能较为稳定,也是一个不错的选择。另外,可能测试程序会有所偏差,希望大家也能够指出问题!

测试程序源代码:IOCPerformanceTest.rar

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

【编辑推荐】

  1. 浅议对.NET第三方控件的一些认识
  2. 五理由 .NET开发者应该关注HTML 5
  3. 微软的沉默 .NET开发者伤不起
  4. 漫谈C#开发中的ASP.NET页生命周期
  5. 纪念VB.NET君
【责任编辑:陈贻新 TEL:(010)68476606】

内容导航
 第 1 页:基础工作  第 2 页:各个IOC框架测试程序



分享到:

  1. 开发 | 老板下了死命令,要上微服务!
  2. 高性能开发的“十大武器”,爱了爱了!

热点职位

更多>>

热点专题

更多>>

读书

软件设计师考试全真模拟试题及解析
本书是按照全国计算机技术与软件专业技术资格(水平)考试《软件设计师考试大纲》的要求,参照《软件设计师教程》及近年来考试试

51CTO旗下网站

领先的IT技术网站 51CTO 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院