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

我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、義馬ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的義馬網(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
其中,測(cè)試程序均采用***的類庫(kù)。
基礎(chǔ)工作
1、程序還是引用上一篇的示例作為測(cè)試背景。
2、編寫一個(gè)性能計(jì)數(shù)器,這里我采用老趙寫的一個(gè)CodeTimer的類,具體介紹見(jiàn):http://www.cnblogs.com/JeffreyZhao/archive/2009/03/10/codetimer.html
使用方式類似于:
- int iteration = 100 * 1000;string s = "";
- CodeTimer.Time("String Concat", iteration, () => { s += "a"; });
- StringBuilder sb = new StringBuilder();
- CodeTimer.Time("StringBuilder", iteration, () => { sb.Append("a"); });
3、編寫一個(gè)IRunner運(yùn)行接口:
- public interface IRunner
- {
- void Start(RunType runType);
- }
以及RunnerBase抽象基礎(chǔ)運(yùn)行類:
- public abstract class RunnerBase
- {
- private int _iteration = Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings["Iteration"] ?? "10000");
- internal int Iteration
- {
- get { return _iteration; }
- }
- internal void Time(Action action)
- {
- CodeTimer.Time(Name, Iteration, action);
- }
- protected abstract string Name { get; }
- }
這里_iteration表示測(cè)試運(yùn)行次數(shù),通過(guò)配置文件來(lái)設(shè)置值。Time方法通過(guò)計(jì)數(shù)器對(duì)action方法進(jìn)行Iteration次迭代。
編寫一個(gè)RunManager的運(yùn)行管理器:
- public class RunManager
- {
- public static void Start(IRunner runner)
- {
- Start(runner, RunType.Transient);
- }
- public static void Start(IRunner runner, RunType runType)
- {
- runner.Start(runType);
- }
- }
在測(cè)試中,我采用兩種方式的性能比較,一個(gè)是單例狀態(tài),一個(gè)是非單例狀態(tài):
- ///
- /// 運(yùn)行狀態(tài)
- ///
- public enum RunType
- {
- ///
- /// 單例
- ///
- Singleton,
- ///
- /// 瞬時(shí)
- ///
- Transient
- }
好了,現(xiàn)在我的程序只要繼承RunnerBase以及IRunnre接口,就可以實(shí)現(xiàn)各個(gè)IOC框架的初始化裝配的工作了?;A(chǔ)工作已經(jīng)做好。
#p#
各個(gè)IOC框架測(cè)試程序
1、Autofac:
- public class AutofacRunner : RunnerBase, IRunner
- {
- protected override string Name
- {
- get { return "Autofac"; }
- }
- public void Start(RunType runType)
- {
- var builder = new ContainerBuilder();
- //if (runType == RunType.Singleton)
- // builder.RegisterType
().SingleInstance(); - //else
- // builder.RegisterType
(); - //builder.RegisterType
().As (); - ////builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
- builder.RegisterType
().As (); - if (runType == RunType.Singleton)
- builder.Register(c => new DatabaseManager(c.Resolve
())).SingleInstance(); - else
- builder.Register(c => new DatabaseManager(c.Resolve
())); - var container = builder.Build();
- Time(() =>
- {
- var manager = container.Resolve
(); - manager.Search("SELECT * FROM USER");
- });
- container.Dispose();
- }
- }
2、Castle Windsor:
- public class WindsorRunner : RunnerBase, IRunner
- {
- protected override string Name
- {
- get { return "Castle Windsor"; }
- }
- public void Start(RunType runType)
- {
- var container = new WindsorContainer();
- if(runType == RunType.Singleton)
- container.Register(Component.For(typeof(DatabaseManager)).LifeStyle.Singleton);
- else
- container.Register(Component.For(typeof(DatabaseManager)).LifeStyle.Transient);
- container.Register(Component.For(typeof(IDatabase)).ImplementedBy(typeof(SqlDatabase)));
- Time(() =>
- {
- var manager = container.Resolve
(); - manager.Search("SELECT * FROM USER");
- });
- }
- }
3、Unity:
- public class UnityRunner : RunnerBase, IRunner
- {
- protected override string Name
- {
- get { return "Unity"; }
- }
- public void Start(RunType runType)
- {
- var container = new UnityContainer();
- if(runType == RunType.Singleton)
- container.RegisterType
(new ContainerControlledLifetimeManager()); - else
- container.RegisterType
(new TransientLifetimeManager()); - container.RegisterType
(); - Time(() =>
- {
- var manager = container.Resolve
(); - manager.Search("SELECT * FROM USER");
- });
- }
- }
4、Spring.NET:
- public class SpringRunner : RunnerBase, IRunner
- {
- protected override string Name
- {
- get { return "Spring.NET"; }
- }
- public void Start(RunType runType)
- {
- string databaseManagerName;
- if (runType == RunType.Singleton)
- databaseManagerName = "DatabaseManager_Singleton";
- else
- databaseManagerName = "DatabaseManager_Transient";
- Time(() =>
- {
- IApplicationContext context = ContextRegistry.GetContext();
- var manager = (DatabaseManager)context.GetObject(databaseManagerName);
- manager.Search("SELECT * FROM USER");
- });
- }
- }
5、StructureMap:
- public class StructureMapRunner : RunnerBase, IRunner
- {
- protected override string Name
- {
- get { return "StructureMap"; }
- }
- public void Start(RunType runType)
- {
- ObjectFactory.Initialize(container =>
- {
- if (runType == RunType.Singleton)
- container.ForRequestedType
().Singleton(); - else
- container.ForRequestedType
(); - container.ForRequestedType
().TheDefaultIsConcreteType (); - });
- Time(() =>
- {
- var manager = ObjectFactory.GetInstance
(); - manager.Search("SELECT * FROM USER");
- });
- }
- }
6、Ninject:
- public class NinjectRunner : RunnerBase, IRunner
- {
- protected override string Name
- {
- get { return "Ninject"; }
- }
- public void Start(RunType runType)
- {
- IKernel kernel = new StandardKernel(new MyNinjectModule(runType));
- Time(() =>
- {
- var manager = kernel.Get
(); - manager.Search("SELECT * FROM USER");
- });
- }
- }
客戶端測(cè)試程序
- static void Main(string[] args)
- {
- CodeTimer.Initialize();
- Console.WriteLine("IOC - Singleton");
- // Autofac Singleton
- RunManager.Start(new AutofacRunner(), RunType.Singleton);
- // Castle Windsor
- RunManager.Start(new WindsorRunner(), RunType.Singleton);
- // Unity
- RunManager.Start(new UnityRunner(), RunType.Singleton);
- // Spring.NET
- RunManager.Start(new SpringRunner(), RunType.Singleton);
- // StructureMap
- RunManager.Start(new StructureMapRunner(), RunType.Singleton);
- // Ninject
- RunManager.Start(new NinjectRunner(), RunType.Singleton);
- Console.WriteLine("===================================");
- Console.WriteLine("IOC - Transient");
- // Autofac Singleton
- RunManager.Start(new AutofacRunner(), RunType.Transient);
- // Castle Windsor
- RunManager.Start(new WindsorRunner(), RunType.Transient);
- // Unity
- RunManager.Start(new UnityRunner(), RunType.Transient);
- // Spring.NET
- RunManager.Start(new SpringRunner(), RunType.Transient);
- // StructureMap
- RunManager.Start(new StructureMapRunner(), RunType.Transient);
- // Ninject
- RunManager.Start(new NinjectRunner(), RunType.Transient);
- Console.ReadKey();
- }
通過(guò)修改App.config的Iteration配置值,來(lái)設(shè)置迭代次數(shù)。
運(yùn)行結(jié)果
1、Iteration=1000:
分析:在千數(shù)量級(jí)時(shí),Autofac,CastleWindsor、StructureMap基本差不多,效率上比其他的要高。
2、Iteration=10000:
分析:在萬(wàn)數(shù)量級(jí)時(shí),Autofac,CastleWindsor,StructureMap基本效率還是差不多,其中StructureMap效率稍稍有些下降;Spring.NET以及Ninject的性能比較低。
3、Iteration=100000:
分析:在十萬(wàn)數(shù)量級(jí)時(shí),CastleWindsor的效率開(kāi)始下降,而在Transient方面,StructureMap和Autofac基本差不多。
4、Iteration=1000000:
分析:在百萬(wàn)數(shù)量級(jí)時(shí),Autofac和StructureMap兩者還是保持比較高的效率,并且在Transient方面,StructureMap已經(jīng)超過(guò)了Autofac。
總結(jié):從測(cè)試中,可以看出Autofac和StructureMap在性能上面還是體現(xiàn)出比較大的優(yōu)勢(shì),Ninject可以說(shuō)性能上較低。而Spring.NET不僅僅專注于IOC方面,它還專注于其他方方面面的功能,所以在IOC方面的性能不是太高。另外,微軟的Unity中規(guī)中矩,性能較為穩(wěn)定,也是一個(gè)不錯(cuò)的選擇。另外,可能測(cè)試程序會(huì)有所偏差,希望大家也能夠指出問(wèn)題!
測(cè)試程序源代碼:IOCPerformanceTest.rar
原文:http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html
本文標(biāo)題:各大主流.Net的IOC框架性能測(cè)試比較
文章轉(zhuǎn)載:http://www.fisionsoft.com.cn/article/dhjodoe.html


咨詢
建站咨詢
