├── .gitignore ├── README.md └── src ├── DependencyInjectorBenchmarks.Tests ├── ContainerTests.cs └── DependencyInjectorBenchmarks.Tests.csproj ├── DependencyInjectorBenchmarks.sln └── DependencyInjectorBenchmarks ├── CombinedBenchmark.cs ├── Containers ├── AspNetCoreBenchmark.cs ├── AutofacBenchmark.cs ├── CastleWindsorBenchmark.cs ├── DirectBenchmark.cs ├── DryIocBenchmark.cs ├── FsContainerBenchmark.cs ├── GraceBenchmark.cs ├── IContainerBenchmark.cs ├── LightinjectBenchmark.cs ├── MicroResolverBenchmark.cs ├── NinjectBenchmark.cs ├── SimpleInjectorBenchmark.cs ├── StructureMapBenchmark.cs └── UnityBenchmark.cs ├── DependencyInjectorBenchmarks.csproj ├── Program.cs ├── Scenarios ├── Combined.cs ├── Singleton.cs └── Transient.cs ├── SingletonBenchmark.cs └── TransientBenchmark.cs /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | 24 | # JetBrains Rider cache/options directory 25 | .idea/ 26 | 27 | # Visual Studio 2015 cache/options directory 28 | .vs/ 29 | # Uncomment if you have tasks that create the project's static files in wwwroot 30 | #wwwroot/ 31 | 32 | # MSTest test Results 33 | [Tt]est[Rr]esult*/ 34 | [Bb]uild[Ll]og.* 35 | 36 | # NUNIT 37 | *.VisualState.xml 38 | TestResult.xml 39 | 40 | # Build Results of an ATL Project 41 | [Dd]ebugPS/ 42 | [Rr]eleasePS/ 43 | dlldata.c 44 | 45 | # DNX 46 | project.lock.json 47 | artifacts/ 48 | 49 | *_i.c 50 | *_p.c 51 | *_i.h 52 | *.ilk 53 | *.meta 54 | *.obj 55 | *.pch 56 | *.pdb 57 | *.pgc 58 | *.pgd 59 | *.rsp 60 | *.sbr 61 | *.tlb 62 | *.tli 63 | *.tlh 64 | *.tmp 65 | *.tmp_proj 66 | *.log 67 | *.vspscc 68 | *.vssscc 69 | .builds 70 | *.pidb 71 | *.svclog 72 | *.scc 73 | 74 | # Chutzpah Test files 75 | _Chutzpah* 76 | 77 | # Visual C++ cache files 78 | ipch/ 79 | *.aps 80 | *.ncb 81 | *.opendb 82 | *.opensdf 83 | *.sdf 84 | *.cachefile 85 | 86 | # Visual Studio profiler 87 | *.psess 88 | *.vsp 89 | *.vspx 90 | *.sap 91 | 92 | # TFS 2012 Local Workspace 93 | $tf/ 94 | 95 | # Guidance Automation Toolkit 96 | *.gpState 97 | 98 | # ReSharper is a .NET coding add-in 99 | _ReSharper*/ 100 | *.[Rr]e[Ss]harper 101 | *.DotSettings.user 102 | 103 | # JustCode is a .NET coding add-in 104 | .JustCode 105 | 106 | # TeamCity is a build add-in 107 | _TeamCity* 108 | 109 | # DotCover is a Code Coverage Tool 110 | *.dotCover 111 | 112 | # NCrunch 113 | _NCrunch_* 114 | .*crunch*.local.xml 115 | nCrunchTemp_* 116 | 117 | # MightyMoose 118 | *.mm.* 119 | AutoTest.Net/ 120 | 121 | # Web workbench (sass) 122 | .sass-cache/ 123 | 124 | # Installshield output folder 125 | [Ee]xpress/ 126 | 127 | # DocProject is a documentation generator add-in 128 | DocProject/buildhelp/ 129 | DocProject/Help/*.HxT 130 | DocProject/Help/*.HxC 131 | DocProject/Help/*.hhc 132 | DocProject/Help/*.hhk 133 | DocProject/Help/*.hhp 134 | DocProject/Help/Html2 135 | DocProject/Help/html 136 | 137 | # Click-Once directory 138 | publish/ 139 | 140 | # Publish Web Output 141 | *.[Pp]ublish.xml 142 | *.azurePubxml 143 | # TODO: Comment the next line if you want to checkin your web deploy settings 144 | # but database connection strings (with potential passwords) will be unencrypted 145 | *.pubxml 146 | *.publishproj 147 | 148 | # NuGet Packages 149 | *.nupkg 150 | # The packages folder can be ignored because of Package Restore 151 | **/packages/* 152 | # except build/, which is used as an MSBuild target. 153 | !**/packages/build/ 154 | # Uncomment if necessary however generally it will be regenerated when needed 155 | #!**/packages/repositories.config 156 | # NuGet v3's project.json files produces more ignoreable files 157 | *.nuget.props 158 | *.nuget.targets 159 | 160 | # Microsoft Azure Build Output 161 | csx/ 162 | *.build.csdef 163 | 164 | # Microsoft Azure Emulator 165 | ecf/ 166 | rcf/ 167 | 168 | # Microsoft Azure ApplicationInsights config file 169 | ApplicationInsights.config 170 | 171 | # Windows Store app package directory 172 | AppPackages/ 173 | BundleArtifacts/ 174 | 175 | # Visual Studio cache files 176 | # files ending in .cache can be ignored 177 | *.[Cc]ache 178 | # but keep track of directories ending in .cache 179 | !*.[Cc]ache/ 180 | 181 | # Others 182 | ClientBin/ 183 | ~$* 184 | *~ 185 | *.dbmdl 186 | *.dbproj.schemaview 187 | *.pfx 188 | *.publishsettings 189 | node_modules/ 190 | orleans.codegen.cs 191 | 192 | # RIA/Silverlight projects 193 | Generated_Code/ 194 | 195 | # Backup & report files from converting an old project file 196 | # to a newer Visual Studio version. Backup files are not needed, 197 | # because we have git ;-) 198 | _UpgradeReport_Files/ 199 | Backup*/ 200 | UpgradeLog*.XML 201 | UpgradeLog*.htm 202 | 203 | # SQL Server files 204 | *.mdf 205 | *.ldf 206 | 207 | # Business Intelligence projects 208 | *.rdl.data 209 | *.bim.layout 210 | *.bim_*.settings 211 | 212 | # Microsoft Fakes 213 | FakesAssemblies/ 214 | 215 | # GhostDoc plugin setting file 216 | *.GhostDoc.xml 217 | 218 | # Node.js Tools for Visual Studio 219 | .ntvs_analysis.dat 220 | 221 | # Visual Studio 6 build log 222 | *.plg 223 | 224 | # Visual Studio 6 workspace options file 225 | *.opt 226 | 227 | # Visual Studio LightSwitch build output 228 | **/*.HTMLClient/GeneratedArtifacts 229 | **/*.DesktopClient/GeneratedArtifacts 230 | **/*.DesktopClient/ModelManifest.xml 231 | **/*.Server/GeneratedArtifacts 232 | **/*.Server/ModelManifest.xml 233 | _Pvt_Extensions 234 | 235 | # Paket dependency manager 236 | .paket/paket.exe 237 | 238 | # FAKE - F# Make 239 | .fake/ 240 | .vscode/ 241 | BenchmarkDotNet.Artifacts/ 242 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DI Container Benchmarks 2 | 3 | Here are the latest results as run on my workstation on March 14th June2018 using the Default workload. 4 | 5 | ## Transient 6 | ``` ini 7 | 8 | BenchmarkDotNet=v0.10.13, OS=Windows 10.0.17120 9 | Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 1 CPU, 8 logical cores and 4 physical cores 10 | .NET Core SDK=2.1.101 11 | [Host] : .NET Core 2.0.6 (CoreCLR 4.6.26212.01, CoreFX 4.6.26212.01), 64bit RyuJIT 12 | DefaultJob : .NET Core 2.0.6 (CoreCLR 4.6.26212.01, CoreFX 4.6.26212.01), 64bit RyuJIT 13 | 14 | 15 | ``` 16 | | Method | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Gen 1 | Allocated | 17 | |--------------- |-------------:|------------:|------------:|---------:|---------:|-------:|-------:|----------:| 18 | | Direct | 3.195 ns | 0.1027 ns | 0.0960 ns | 1.00 | 0.00 | 0.0076 | - | 24 B | 19 | | DryIoc | 13.335 ns | 0.2037 ns | 0.1905 ns | 4.18 | 0.13 | 0.0076 | - | 24 B | 20 | | MicroResolver | 16.943 ns | 0.2175 ns | 0.1928 ns | 5.31 | 0.16 | 0.0076 | - | 24 B | 21 | | LightInject | 20.331 ns | 0.2693 ns | 0.2519 ns | 6.37 | 0.20 | 0.0076 | - | 24 B | 22 | | SimpleInjector | 33.023 ns | 0.6436 ns | 0.5705 ns | 10.35 | 0.34 | 0.0076 | - | 24 B | 23 | | AspNetCore | 51.367 ns | 0.5381 ns | 0.5034 ns | 16.09 | 0.49 | 0.0076 | - | 24 B | 24 | | FsContainer | 477.072 ns | 4.2279 ns | 3.5305 ns | 149.45 | 4.45 | 0.1040 | - | 328 B | 25 | | Autofac | 517.324 ns | 5.9056 ns | 5.5241 ns | 162.06 | 4.97 | 0.2384 | - | 752 B | 26 | | Unity | 619.830 ns | 7.0641 ns | 6.2621 ns | 194.17 | 5.92 | 0.3271 | - | 1032 B | 27 | | StructureMap | 629.680 ns | 7.1003 ns | 5.9291 ns | 197.26 | 5.97 | 0.3271 | - | 1032 B | 28 | | CastleWindsor | 1,666.698 ns | 18.7414 ns | 17.5307 ns | 522.13 | 15.99 | 0.3262 | - | 1032 B | 29 | | Ninject | 4,148.708 ns | 127.9779 ns | 371.2870 ns | 1,299.67 | 121.69 | 0.6180 | 0.1526 | 1968 B | 30 | 31 | ## Singleton 32 | ``` ini 33 | 34 | BenchmarkDotNet=v0.10.13, OS=Windows 10.0.17120 35 | Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 1 CPU, 8 logical cores and 4 physical cores 36 | .NET Core SDK=2.1.101 37 | [Host] : .NET Core 2.0.6 (CoreCLR 4.6.26212.01, CoreFX 4.6.26212.01), 64bit RyuJIT 38 | DefaultJob : .NET Core 2.0.6 (CoreCLR 4.6.26212.01, CoreFX 4.6.26212.01), 64bit RyuJIT 39 | 40 | 41 | ``` 42 | | Method | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Allocated | 43 | |--------------- |-------------:|-----------:|-----------:|-------:|---------:|-------:|----------:| 44 | | Direct | 2.404 ns | 0.0529 ns | 0.0495 ns | 1.00 | 0.00 | - | 0 B | 45 | | DryIoc | 11.411 ns | 0.0938 ns | 0.0784 ns | 4.75 | 0.10 | - | 0 B | 46 | | MicroResolver | 14.159 ns | 0.1073 ns | 0.0896 ns | 5.89 | 0.12 | - | 0 B | 47 | | LightInject | 17.815 ns | 0.2047 ns | 0.1914 ns | 7.41 | 0.17 | - | 0 B | 48 | | SimpleInjector | 30.325 ns | 0.1318 ns | 0.1233 ns | 12.62 | 0.26 | - | 0 B | 49 | | AspNetCore | 52.003 ns | 0.3158 ns | 0.2800 ns | 21.64 | 0.45 | - | 0 B | 50 | | FsContainer | 171.787 ns | 3.3404 ns | 3.1246 ns | 71.47 | 1.91 | 0.0634 | 200 B | 51 | | CastleWindsor | 289.855 ns | 4.7062 ns | 4.4022 ns | 120.60 | 3.00 | 0.1092 | 344 B | 52 | | Autofac | 416.878 ns | 4.7939 ns | 4.4842 ns | 173.45 | 3.93 | 0.2031 | 640 B | 53 | | Unity | 541.201 ns | 8.5350 ns | 7.9836 ns | 225.17 | 5.55 | 0.3834 | 1208 B | 54 | | StructureMap | 555.625 ns | 8.0762 ns | 6.7440 ns | 231.17 | 5.38 | 0.3834 | 1208 B | 55 | | Ninject | 1,225.033 ns | 19.3328 ns | 18.0839 ns | 509.69 | 12.57 | 0.3376 | 1064 B | 56 | 57 | ## Combined (resolving a transient containing one transient and one singleton) 58 | ``` ini 59 | 60 | BenchmarkDotNet=v0.10.13, OS=Windows 10.0.17120 61 | Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 1 CPU, 8 logical cores and 4 physical cores 62 | .NET Core SDK=2.1.101 63 | [Host] : .NET Core 2.0.6 (CoreCLR 4.6.26212.01, CoreFX 4.6.26212.01), 64bit RyuJIT 64 | DefaultJob : .NET Core 2.0.6 (CoreCLR 4.6.26212.01, CoreFX 4.6.26212.01), 64bit RyuJIT 65 | 66 | 67 | ``` 68 | | Method | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Gen 1 | Allocated | 69 | |--------------- |-------------:|------------:|------------:|-------:|---------:|-------:|-------:|----------:| 70 | | Direct | 12.49 ns | 0.2079 ns | 0.1944 ns | 1.00 | 0.00 | 0.0178 | - | 56 B | 71 | | DryIoc | 24.35 ns | 0.3008 ns | 0.2666 ns | 1.95 | 0.04 | 0.0178 | - | 56 B | 72 | | LightInject | 28.87 ns | 0.4784 ns | 0.4475 ns | 2.31 | 0.05 | 0.0178 | - | 56 B | 73 | | MicroResolver | 29.81 ns | 0.2379 ns | 0.1857 ns | 2.39 | 0.04 | 0.0178 | - | 56 B | 74 | | SimpleInjector | 46.78 ns | 0.6450 ns | 0.6033 ns | 3.75 | 0.07 | 0.0178 | - | 56 B | 75 | | AspNetCore | 61.54 ns | 0.7182 ns | 0.6367 ns | 4.93 | 0.09 | 0.0178 | - | 56 B | 76 | | FsContainer | 1,027.39 ns | 13.1911 ns | 12.3390 ns | 82.25 | 1.57 | 0.2327 | - | 736 B | 77 | | Autofac | 1,411.27 ns | 24.7593 ns | 21.9485 ns | 112.98 | 2.41 | 0.5741 | - | 1808 B | 78 | | Unity | 1,664.15 ns | 19.5121 ns | 18.2516 ns | 133.22 | 2.47 | 0.6580 | - | 2072 B | 79 | | StructureMap | 1,684.32 ns | 33.0940 ns | 27.6350 ns | 134.84 | 2.96 | 0.6580 | - | 2072 B | 80 | | CastleWindsor | 7,149.85 ns | 107.4464 ns | 100.5055 ns | 572.38 | 11.68 | 0.8316 | - | 2632 B | 81 | | Ninject | 10,228.69 ns | 265.0937 ns | 769.0850 ns | 818.85 | 62.51 | 1.7700 | 0.4272 | 5584 B | 82 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks.Tests/ContainerTests.cs: -------------------------------------------------------------------------------- 1 | using DependencyInjectorBenchmarks.Containers; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | using Microsoft.VisualStudio.TestTools.UnitTesting; 8 | 9 | namespace DependencyInjectorBenchmarks.Tests 10 | { 11 | [TestClass] 12 | public class ContainerTests 13 | { 14 | [TestMethod] 15 | public void TestSingleton() 16 | { 17 | Assert.IsNotNull(DirectBenchmark.Instance.ResolveSingleton()); 18 | Assert.IsNotNull(NinjectBenchmark.Instance.ResolveSingleton()); 19 | Assert.IsNotNull(SimpleInjectorBenchmark.Instance.ResolveSingleton()); 20 | Assert.IsNotNull(AutofacBenchmark.Instance.ResolveSingleton()); 21 | Assert.IsNotNull(AspNetCoreBenchmark.Instance.ResolveSingleton()); 22 | Assert.IsNotNull(CastleWindsorBenchmark.Instance.ResolveSingleton()); 23 | Assert.IsNotNull(LightInjectBenchmark.Instance.ResolveSingleton()); 24 | Assert.IsNotNull(StructureMapBenchmark.Instance.ResolveSingleton()); 25 | Assert.IsNotNull(FsContainerBenchmark.Instance.ResolveSingleton()); 26 | Assert.IsNotNull(DryIocBenchmark.Instance.ResolveSingleton()); 27 | Assert.IsNotNull(UnityBenchmark.Instance.ResolveSingleton()); 28 | Assert.IsNotNull(MicroResolverBenchmark.Instance.ResolveSingleton()); 29 | Assert.IsNotNull(GraceBenchmark.Instance.ResolveSingleton()); 30 | 31 | Assert.AreSame(DirectBenchmark.Instance.ResolveSingleton(), DirectBenchmark.Instance.ResolveSingleton()); 32 | Assert.AreSame(NinjectBenchmark.Instance.ResolveSingleton(), NinjectBenchmark.Instance.ResolveSingleton()); 33 | Assert.AreSame(SimpleInjectorBenchmark.Instance.ResolveSingleton(), SimpleInjectorBenchmark.Instance.ResolveSingleton()); 34 | Assert.AreSame(AutofacBenchmark.Instance.ResolveSingleton(), AutofacBenchmark.Instance.ResolveSingleton()); 35 | Assert.AreSame(AspNetCoreBenchmark.Instance.ResolveSingleton(), AspNetCoreBenchmark.Instance.ResolveSingleton()); 36 | Assert.AreSame(CastleWindsorBenchmark.Instance.ResolveSingleton(), CastleWindsorBenchmark.Instance.ResolveSingleton()); 37 | Assert.AreSame(LightInjectBenchmark.Instance.ResolveSingleton(), LightInjectBenchmark.Instance.ResolveSingleton()); 38 | Assert.AreSame(StructureMapBenchmark.Instance.ResolveSingleton(), StructureMapBenchmark.Instance.ResolveSingleton()); 39 | Assert.AreSame(FsContainerBenchmark.Instance.ResolveSingleton(), FsContainerBenchmark.Instance.ResolveSingleton()); 40 | Assert.AreSame(DryIocBenchmark.Instance.ResolveSingleton(), DryIocBenchmark.Instance.ResolveSingleton()); 41 | Assert.AreSame(UnityBenchmark.Instance.ResolveSingleton(), UnityBenchmark.Instance.ResolveSingleton()); 42 | Assert.AreSame(MicroResolverBenchmark.Instance.ResolveSingleton(), MicroResolverBenchmark.Instance.ResolveSingleton()); 43 | Assert.AreSame(GraceBenchmark.Instance.ResolveSingleton(), GraceBenchmark.Instance.ResolveSingleton()); 44 | } 45 | 46 | [TestMethod] 47 | public void TestTransient() 48 | { 49 | Assert.IsNotNull(DirectBenchmark.Instance.ResolveTransient()); 50 | Assert.IsNotNull(NinjectBenchmark.Instance.ResolveTransient()); 51 | Assert.IsNotNull(SimpleInjectorBenchmark.Instance.ResolveTransient()); 52 | Assert.IsNotNull(AutofacBenchmark.Instance.ResolveTransient()); 53 | Assert.IsNotNull(AspNetCoreBenchmark.Instance.ResolveTransient()); 54 | Assert.IsNotNull(CastleWindsorBenchmark.Instance.ResolveTransient()); 55 | Assert.IsNotNull(LightInjectBenchmark.Instance.ResolveTransient()); 56 | Assert.IsNotNull(StructureMapBenchmark.Instance.ResolveTransient()); 57 | Assert.IsNotNull(FsContainerBenchmark.Instance.ResolveTransient()); 58 | Assert.IsNotNull(DryIocBenchmark.Instance.ResolveTransient()); 59 | Assert.IsNotNull(UnityBenchmark.Instance.ResolveTransient()); 60 | Assert.IsNotNull(MicroResolverBenchmark.Instance.ResolveTransient()); 61 | Assert.IsNotNull(GraceBenchmark.Instance.ResolveTransient()); 62 | 63 | Assert.AreNotSame(DirectBenchmark.Instance.ResolveTransient(), DirectBenchmark.Instance.ResolveTransient()); 64 | Assert.AreNotSame(NinjectBenchmark.Instance.ResolveTransient(), NinjectBenchmark.Instance.ResolveTransient()); 65 | Assert.AreNotSame(SimpleInjectorBenchmark.Instance.ResolveTransient(), SimpleInjectorBenchmark.Instance.ResolveTransient()); 66 | Assert.AreNotSame(AutofacBenchmark.Instance.ResolveTransient(), AutofacBenchmark.Instance.ResolveTransient()); 67 | Assert.AreNotSame(AspNetCoreBenchmark.Instance.ResolveTransient(), AspNetCoreBenchmark.Instance.ResolveTransient()); 68 | Assert.AreNotSame(CastleWindsorBenchmark.Instance.ResolveTransient(), CastleWindsorBenchmark.Instance.ResolveTransient()); 69 | Assert.AreNotSame(LightInjectBenchmark.Instance.ResolveTransient(), LightInjectBenchmark.Instance.ResolveTransient()); 70 | Assert.AreNotSame(StructureMapBenchmark.Instance.ResolveTransient(), StructureMapBenchmark.Instance.ResolveTransient()); 71 | Assert.AreNotSame(FsContainerBenchmark.Instance.ResolveTransient(), FsContainerBenchmark.Instance.ResolveTransient()); 72 | Assert.AreNotSame(DryIocBenchmark.Instance.ResolveTransient(), DryIocBenchmark.Instance.ResolveTransient()); 73 | Assert.AreNotSame(UnityBenchmark.Instance.ResolveTransient(), UnityBenchmark.Instance.ResolveTransient()); 74 | Assert.AreNotSame(MicroResolverBenchmark.Instance.ResolveTransient(), MicroResolverBenchmark.Instance.ResolveTransient()); 75 | Assert.AreNotSame(GraceBenchmark.Instance.ResolveTransient(), GraceBenchmark.Instance.ResolveTransient()); 76 | } 77 | 78 | [TestMethod] 79 | public void TestCombined() 80 | { 81 | Assert.IsNotNull(DirectBenchmark.Instance.ResolveCombined()); 82 | Assert.IsNotNull(NinjectBenchmark.Instance.ResolveCombined()); 83 | Assert.IsNotNull(SimpleInjectorBenchmark.Instance.ResolveCombined()); 84 | Assert.IsNotNull(AutofacBenchmark.Instance.ResolveCombined()); 85 | Assert.IsNotNull(AspNetCoreBenchmark.Instance.ResolveCombined()); 86 | Assert.IsNotNull(CastleWindsorBenchmark.Instance.ResolveCombined()); 87 | Assert.IsNotNull(LightInjectBenchmark.Instance.ResolveCombined()); 88 | Assert.IsNotNull(StructureMapBenchmark.Instance.ResolveCombined()); 89 | Assert.IsNotNull(FsContainerBenchmark.Instance.ResolveCombined()); 90 | Assert.IsNotNull(DryIocBenchmark.Instance.ResolveCombined()); 91 | Assert.IsNotNull(UnityBenchmark.Instance.ResolveCombined()); 92 | Assert.IsNotNull(MicroResolverBenchmark.Instance.ResolveCombined()); 93 | Assert.IsNotNull(GraceBenchmark.Instance.ResolveCombined()); 94 | 95 | Assert.AreNotSame(DirectBenchmark.Instance.ResolveCombined(), DirectBenchmark.Instance.ResolveCombined()); 96 | Assert.AreNotSame(NinjectBenchmark.Instance.ResolveCombined(), NinjectBenchmark.Instance.ResolveCombined()); 97 | Assert.AreNotSame(SimpleInjectorBenchmark.Instance.ResolveCombined(), SimpleInjectorBenchmark.Instance.ResolveCombined()); 98 | Assert.AreNotSame(AutofacBenchmark.Instance.ResolveCombined(), AutofacBenchmark.Instance.ResolveCombined()); 99 | Assert.AreNotSame(AspNetCoreBenchmark.Instance.ResolveCombined(), AspNetCoreBenchmark.Instance.ResolveCombined()); 100 | Assert.AreNotSame(CastleWindsorBenchmark.Instance.ResolveCombined(), CastleWindsorBenchmark.Instance.ResolveCombined()); 101 | Assert.AreNotSame(LightInjectBenchmark.Instance.ResolveCombined(), LightInjectBenchmark.Instance.ResolveCombined()); 102 | Assert.AreNotSame(StructureMapBenchmark.Instance.ResolveCombined(), StructureMapBenchmark.Instance.ResolveCombined()); 103 | Assert.AreNotSame(FsContainerBenchmark.Instance.ResolveCombined(), FsContainerBenchmark.Instance.ResolveCombined()); 104 | Assert.AreNotSame(DryIocBenchmark.Instance.ResolveCombined(), DryIocBenchmark.Instance.ResolveCombined()); 105 | Assert.AreNotSame(UnityBenchmark.Instance.ResolveCombined(), UnityBenchmark.Instance.ResolveCombined()); 106 | Assert.AreNotSame(MicroResolverBenchmark.Instance.ResolveCombined(), MicroResolverBenchmark.Instance.ResolveCombined()); 107 | Assert.AreNotSame(GraceBenchmark.Instance.ResolveCombined(), GraceBenchmark.Instance.ResolveCombined()); 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks.Tests/DependencyInjectorBenchmarks.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio 15 3 | VisualStudioVersion = 15.0.26730.12 4 | MinimumVisualStudioVersion = 15.0.26124.0 5 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DependencyInjectorBenchmarks", "DependencyInjectorBenchmarks\DependencyInjectorBenchmarks.csproj", "{D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}" 6 | EndProject 7 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DependencyInjectorBenchmarks.Tests", "DependencyInjectorBenchmarks.Tests\DependencyInjectorBenchmarks.Tests.csproj", "{F8318630-C34F-4562-8D25-642F3437C270}" 8 | EndProject 9 | Global 10 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 11 | Debug|Any CPU = Debug|Any CPU 12 | Debug|x64 = Debug|x64 13 | Debug|x86 = Debug|x86 14 | Release|Any CPU = Release|Any CPU 15 | Release|x64 = Release|x64 16 | Release|x86 = Release|x86 17 | EndGlobalSection 18 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 19 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 20 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Debug|Any CPU.Build.0 = Debug|Any CPU 21 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Debug|x64.ActiveCfg = Debug|Any CPU 22 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Debug|x64.Build.0 = Debug|Any CPU 23 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Debug|x86.ActiveCfg = Debug|Any CPU 24 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Debug|x86.Build.0 = Debug|Any CPU 25 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Release|Any CPU.ActiveCfg = Release|Any CPU 26 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Release|Any CPU.Build.0 = Release|Any CPU 27 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Release|x64.ActiveCfg = Release|Any CPU 28 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Release|x64.Build.0 = Release|Any CPU 29 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Release|x86.ActiveCfg = Release|Any CPU 30 | {D839EABE-7D56-433D-B2AE-FCAC8AC6DDC0}.Release|x86.Build.0 = Release|Any CPU 31 | {F8318630-C34F-4562-8D25-642F3437C270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 32 | {F8318630-C34F-4562-8D25-642F3437C270}.Debug|Any CPU.Build.0 = Debug|Any CPU 33 | {F8318630-C34F-4562-8D25-642F3437C270}.Debug|x64.ActiveCfg = Debug|Any CPU 34 | {F8318630-C34F-4562-8D25-642F3437C270}.Debug|x64.Build.0 = Debug|Any CPU 35 | {F8318630-C34F-4562-8D25-642F3437C270}.Debug|x86.ActiveCfg = Debug|Any CPU 36 | {F8318630-C34F-4562-8D25-642F3437C270}.Debug|x86.Build.0 = Debug|Any CPU 37 | {F8318630-C34F-4562-8D25-642F3437C270}.Release|Any CPU.ActiveCfg = Release|Any CPU 38 | {F8318630-C34F-4562-8D25-642F3437C270}.Release|Any CPU.Build.0 = Release|Any CPU 39 | {F8318630-C34F-4562-8D25-642F3437C270}.Release|x64.ActiveCfg = Release|Any CPU 40 | {F8318630-C34F-4562-8D25-642F3437C270}.Release|x64.Build.0 = Release|Any CPU 41 | {F8318630-C34F-4562-8D25-642F3437C270}.Release|x86.ActiveCfg = Release|Any CPU 42 | {F8318630-C34F-4562-8D25-642F3437C270}.Release|x86.Build.0 = Release|Any CPU 43 | EndGlobalSection 44 | GlobalSection(SolutionProperties) = preSolution 45 | HideSolutionNode = FALSE 46 | EndGlobalSection 47 | GlobalSection(ExtensibilityGlobals) = postSolution 48 | SolutionGuid = {696B8584-4D6E-44A6-894B-8B1118FC6323} 49 | EndGlobalSection 50 | EndGlobal 51 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/CombinedBenchmark.cs: -------------------------------------------------------------------------------- 1 | using BenchmarkDotNet.Attributes; 2 | using BenchmarkDotNet.Attributes.Exporters; 3 | using BenchmarkDotNet.Order; 4 | using DependencyInjectorBenchmarks.Containers; 5 | using DependencyInjectorBenchmarks.Scenarios; 6 | 7 | namespace DependencyInjectorBenchmarks 8 | { 9 | [MemoryDiagnoser] 10 | [OrderProvider(SummaryOrderPolicy.FastestToSlowest, MethodOrderPolicy.Declared)] 11 | [MarkdownExporter] 12 | public class CombinedBenchmark 13 | { 14 | [Benchmark(Baseline = true)] 15 | public ICombined Direct() => DirectBenchmark.Instance.ResolveCombined(); 16 | 17 | [Benchmark] 18 | public ICombined SimpleInjector() => SimpleInjectorBenchmark.Instance.ResolveCombined(); 19 | 20 | [Benchmark] 21 | public ICombined Ninject() => NinjectBenchmark.Instance.ResolveCombined(); 22 | 23 | [Benchmark] 24 | public ICombined Autofac() => AutofacBenchmark.Instance.ResolveCombined(); 25 | 26 | [Benchmark] 27 | public ICombined AspNetCore() => AspNetCoreBenchmark.Instance.ResolveCombined(); 28 | 29 | [Benchmark] 30 | public ICombined CastleWindsor() => CastleWindsorBenchmark.Instance.ResolveCombined(); 31 | 32 | [Benchmark] 33 | public ICombined LightInject() => LightInjectBenchmark.Instance.ResolveCombined(); 34 | 35 | [Benchmark] 36 | public ICombined StructureMap() => StructureMapBenchmark.Instance.ResolveCombined(); 37 | 38 | [Benchmark] 39 | public ICombined FsContainer() => FsContainerBenchmark.Instance.ResolveCombined(); 40 | 41 | [Benchmark] 42 | public ICombined DryIoc() => DryIocBenchmark.Instance.ResolveCombined(); 43 | 44 | [Benchmark] 45 | public ICombined Unity() => UnityBenchmark.Instance.ResolveCombined(); 46 | 47 | [Benchmark] 48 | public ICombined MicroResolver() => MicroResolverBenchmark.Instance.ResolveCombined(); 49 | 50 | [Benchmark] 51 | public ICombined Grace() => GraceBenchmark.Instance.ResolveCombined(); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/AspNetCoreBenchmark.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Extensions.DependencyInjection; 3 | using DependencyInjectorBenchmarks.Scenarios; 4 | 5 | namespace DependencyInjectorBenchmarks.Containers 6 | { 7 | public class AspNetCoreBenchmark : IContainerBenchmark 8 | { 9 | public static readonly AspNetCoreBenchmark Instance = new AspNetCoreBenchmark(); 10 | 11 | private readonly IServiceProvider provider; 12 | 13 | public AspNetCoreBenchmark() 14 | { 15 | var serviceCollection = new ServiceCollection(); 16 | 17 | serviceCollection.AddSingleton(Singleton.Instance); 18 | serviceCollection.AddTransient(); 19 | serviceCollection.AddTransient(); 20 | 21 | provider = serviceCollection.BuildServiceProvider(); 22 | } 23 | 24 | public ICombined ResolveCombined() => provider.GetService(); 25 | 26 | public ISingleton ResolveSingleton() => provider.GetService(); 27 | 28 | public ITransient ResolveTransient() => provider.GetService(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/AutofacBenchmark.cs: -------------------------------------------------------------------------------- 1 | using Autofac; 2 | using DependencyInjectorBenchmarks.Scenarios; 3 | 4 | namespace DependencyInjectorBenchmarks.Containers 5 | { 6 | public class AutofacBenchmark : IContainerBenchmark 7 | { 8 | public static readonly AutofacBenchmark Instance = new AutofacBenchmark(); 9 | 10 | private readonly IContainer container; 11 | 12 | public AutofacBenchmark() 13 | { 14 | var builder = new ContainerBuilder(); 15 | builder.RegisterType().As().SingleInstance(); 16 | builder.RegisterType().As().InstancePerDependency(); 17 | builder.RegisterType().As().InstancePerDependency(); 18 | container = builder.Build(); 19 | } 20 | 21 | public ICombined ResolveCombined() => container.Resolve(); 22 | 23 | public ISingleton ResolveSingleton() => container.Resolve(); 24 | 25 | public ITransient ResolveTransient() => container.Resolve(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/CastleWindsorBenchmark.cs: -------------------------------------------------------------------------------- 1 | using Castle.MicroKernel; 2 | using Castle.MicroKernel.Registration; 3 | using Castle.Windsor; 4 | using DependencyInjectorBenchmarks.Scenarios; 5 | 6 | namespace DependencyInjectorBenchmarks.Containers 7 | { 8 | public class CastleWindsorBenchmark : IContainerBenchmark 9 | { 10 | public static readonly CastleWindsorBenchmark Instance = new CastleWindsorBenchmark(); 11 | 12 | private readonly IWindsorContainer container; 13 | 14 | public CastleWindsorBenchmark() 15 | { 16 | container = new WindsorContainer(); 17 | container.Register( 18 | Component.For().ImplementedBy().LifestyleSingleton(), 19 | Component.For().ImplementedBy().LifestyleTransient(), 20 | Component.For().ImplementedBy().LifestyleTransient() 21 | ); 22 | } 23 | 24 | public ICombined ResolveCombined() => container.Resolve(); 25 | 26 | public ISingleton ResolveSingleton() => container.Resolve(); 27 | 28 | public ITransient ResolveTransient() => container.Resolve(); 29 | } 30 | } -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/DirectBenchmark.cs: -------------------------------------------------------------------------------- 1 | using DependencyInjectorBenchmarks.Scenarios; 2 | using System; 3 | 4 | namespace DependencyInjectorBenchmarks.Containers 5 | { 6 | public class DirectBenchmark : IContainerBenchmark 7 | { 8 | public static readonly DirectBenchmark Instance = new DirectBenchmark(); 9 | 10 | public ICombined ResolveCombined() => new Combined(Singleton.Instance, new Transient()); 11 | 12 | public ISingleton ResolveSingleton() => Singleton.Instance; 13 | 14 | public ITransient ResolveTransient() => new Transient(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/DryIocBenchmark.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | using DependencyInjectorBenchmarks.Scenarios; 5 | using DryIoc; 6 | 7 | namespace DependencyInjectorBenchmarks.Containers 8 | { 9 | public class DryIocBenchmark : IContainerBenchmark 10 | { 11 | public static readonly DryIocBenchmark Instance = new DryIocBenchmark(); 12 | 13 | private Container container; 14 | 15 | public DryIocBenchmark() 16 | { 17 | container = new Container(); 18 | 19 | container.Register(Reuse.Singleton, Made.Of(() => Singleton.Instance)); 20 | container.Register(); 21 | container.Register(); 22 | } 23 | 24 | public ICombined ResolveCombined() 25 | => container.Resolve(); 26 | 27 | public ISingleton ResolveSingleton() 28 | => container.Resolve(); 29 | 30 | public ITransient ResolveTransient() 31 | => container.Resolve(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/FsContainerBenchmark.cs: -------------------------------------------------------------------------------- 1 | using DependencyInjectorBenchmarks.Scenarios; 2 | using Fs.Container.Core; 3 | using Fs.Container.Core.Lifetime; 4 | 5 | namespace DependencyInjectorBenchmarks.Containers { 6 | public class FsContainerBenchmark : IContainerBenchmark 7 | { 8 | public static readonly FsContainerBenchmark Instance = new FsContainerBenchmark(); 9 | 10 | private readonly IFsContainer container = new FsContainer(); 11 | 12 | public FsContainerBenchmark() 13 | { 14 | container.For().Use(new ContainerControlledLifetimeManager()); 15 | container.For().Use(new TransientLifetimeManager()); 16 | container.For().Use(new TransientLifetimeManager()); 17 | } 18 | 19 | public ISingleton ResolveSingleton() => container.Resolve(); 20 | 21 | public ITransient ResolveTransient() => container.Resolve(); 22 | 23 | public ICombined ResolveCombined() => container.Resolve(); 24 | } 25 | } -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/GraceBenchmark.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | using DependencyInjectorBenchmarks.Scenarios; 5 | using Grace.DependencyInjection; 6 | 7 | namespace DependencyInjectorBenchmarks.Containers 8 | { 9 | public class GraceBenchmark : IContainerBenchmark 10 | { 11 | public static readonly GraceBenchmark Instance = new GraceBenchmark(); 12 | 13 | private DependencyInjectionContainer container; 14 | 15 | public GraceBenchmark() 16 | { 17 | container = new DependencyInjectionContainer 18 | { 19 | c => 20 | { 21 | c.ExportInstance(Singleton.Instance).Lifestyle.Singleton(); 22 | c.Export().As(); 23 | c.Export().As(); 24 | } 25 | }; 26 | } 27 | 28 | public ISingleton ResolveSingleton() => container.Locate(); 29 | 30 | public ITransient ResolveTransient() => container.Locate(); 31 | 32 | public ICombined ResolveCombined() => container.Locate(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/IContainerBenchmark.cs: -------------------------------------------------------------------------------- 1 | using DependencyInjectorBenchmarks.Scenarios; 2 | 3 | namespace DependencyInjectorBenchmarks.Containers 4 | { 5 | public interface IContainerBenchmark 6 | { 7 | ISingleton ResolveSingleton(); 8 | ITransient ResolveTransient(); 9 | ICombined ResolveCombined(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/LightinjectBenchmark.cs: -------------------------------------------------------------------------------- 1 | using LightInject; 2 | using DependencyInjectorBenchmarks.Scenarios; 3 | 4 | namespace DependencyInjectorBenchmarks.Containers 5 | { 6 | public class LightInjectBenchmark : IContainerBenchmark 7 | { 8 | public static readonly LightInjectBenchmark Instance = new LightInjectBenchmark(); 9 | 10 | private readonly IServiceContainer container; 11 | 12 | public LightInjectBenchmark() 13 | { 14 | this.container = new ServiceContainer(); 15 | this.container.Register(new PerContainerLifetime()); 16 | this.container.Register(); 17 | this.container.Register(); 18 | } 19 | 20 | public ISingleton ResolveSingleton() => this.container.GetInstance(); 21 | 22 | public ITransient ResolveTransient() => this.container.GetInstance(); 23 | 24 | public ICombined ResolveCombined() => this.container.GetInstance(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/MicroResolverBenchmark.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | using DependencyInjectorBenchmarks.Scenarios; 5 | 6 | namespace DependencyInjectorBenchmarks.Containers 7 | { 8 | public class MicroResolverBenchmark : IContainerBenchmark 9 | { 10 | public static MicroResolverBenchmark Instance { get; } = new MicroResolverBenchmark(); 11 | 12 | MicroResolver.ObjectResolver container = MicroResolver.ObjectResolver.Create(); 13 | 14 | public MicroResolverBenchmark() 15 | { 16 | container.Register(MicroResolver.Lifestyle.Singleton); 17 | container.Register(MicroResolver.Lifestyle.Transient); 18 | container.Register(MicroResolver.Lifestyle.Transient); 19 | container.Compile(); 20 | } 21 | 22 | public ICombined ResolveCombined() 23 | { 24 | return container.Resolve(); 25 | } 26 | 27 | public ISingleton ResolveSingleton() 28 | { 29 | return container.Resolve(); 30 | } 31 | 32 | public ITransient ResolveTransient() 33 | { 34 | return container.Resolve(); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/NinjectBenchmark.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Ninject; 3 | using DependencyInjectorBenchmarks.Scenarios; 4 | 5 | namespace DependencyInjectorBenchmarks.Containers 6 | { 7 | public class NinjectBenchmark : IContainerBenchmark 8 | { 9 | public static readonly NinjectBenchmark Instance = new NinjectBenchmark(); 10 | 11 | private readonly IReadOnlyKernel kernel; 12 | 13 | public NinjectBenchmark() 14 | { 15 | var config = new KernelConfiguration(); 16 | config.Bind().To().InSingletonScope(); 17 | config.Bind().To().InTransientScope(); 18 | config.Bind().To().InTransientScope(); 19 | kernel = config.BuildReadonlyKernel(); 20 | } 21 | 22 | public ICombined ResolveCombined() => kernel.Get(); 23 | 24 | public ISingleton ResolveSingleton() => kernel.Get(); 25 | 26 | public ITransient ResolveTransient() => kernel.Get(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/SimpleInjectorBenchmark.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using SimpleInjector; 3 | using DependencyInjectorBenchmarks.Scenarios; 4 | 5 | namespace DependencyInjectorBenchmarks.Containers 6 | { 7 | public class SimpleInjectorBenchmark : IContainerBenchmark 8 | { 9 | public static readonly SimpleInjectorBenchmark Instance = new SimpleInjectorBenchmark(); 10 | 11 | private readonly Container container = new Container(); 12 | public SimpleInjectorBenchmark() 13 | { 14 | container.Register(Lifestyle.Singleton); 15 | container.Register(Lifestyle.Transient); 16 | container.Register(Lifestyle.Transient); 17 | } 18 | 19 | public ICombined ResolveCombined() => container.GetInstance(); 20 | 21 | public ISingleton ResolveSingleton() => container.GetInstance(); 22 | 23 | public ITransient ResolveTransient() => container.GetInstance(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/StructureMapBenchmark.cs: -------------------------------------------------------------------------------- 1 | using DependencyInjectorBenchmarks.Scenarios; 2 | using StructureMap; 3 | 4 | namespace DependencyInjectorBenchmarks.Containers 5 | { 6 | public class StructureMapBenchmark : IContainerBenchmark 7 | { 8 | public static readonly StructureMapBenchmark Instance = new StructureMapBenchmark(); 9 | 10 | private readonly Container container = new Container(); 11 | public StructureMapBenchmark() 12 | { 13 | container.Configure(conf => 14 | { 15 | conf.For().Use().Singleton(); 16 | conf.For().Use().Transient(); 17 | conf.For().Use().Transient(); 18 | }); 19 | } 20 | 21 | public ICombined ResolveCombined() => container.GetInstance(); 22 | 23 | public ISingleton ResolveSingleton() => container.GetInstance(); 24 | 25 | public ITransient ResolveTransient() => container.GetInstance(); 26 | } 27 | } -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Containers/UnityBenchmark.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | using DependencyInjectorBenchmarks.Scenarios; 5 | using Unity; 6 | 7 | namespace DependencyInjectorBenchmarks.Containers 8 | { 9 | public class UnityBenchmark : IContainerBenchmark 10 | { 11 | public static readonly StructureMapBenchmark Instance = new StructureMapBenchmark(); 12 | 13 | UnityContainer container = new UnityContainer(); 14 | 15 | public UnityBenchmark() 16 | { 17 | container.RegisterSingleton(); 18 | container.RegisterType(); 19 | container.RegisterType(); 20 | } 21 | public ICombined ResolveCombined() 22 | { 23 | return container.Resolve(); 24 | } 25 | 26 | public ISingleton ResolveSingleton() 27 | { 28 | return container.Resolve(); 29 | } 30 | 31 | public ITransient ResolveTransient() 32 | { 33 | return container.Resolve(); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/DependencyInjectorBenchmarks.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Exe 5 | netcoreapp2.0 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Program.cs: -------------------------------------------------------------------------------- 1 | using BenchmarkDotNet.Attributes; 2 | using BenchmarkDotNet.Configs; 3 | using BenchmarkDotNet.Jobs; 4 | using BenchmarkDotNet.Running; 5 | using DependencyInjectorBenchmarks.Containers; 6 | using System; 7 | 8 | namespace DependencyInjectorBenchmarks 9 | { 10 | class Program 11 | { 12 | static void Main(string[] args) 13 | { 14 | BenchmarkSwitcher switcher = new BenchmarkSwitcher(new[] { typeof(SingletonBenchmark), typeof(TransientBenchmark), typeof(CombinedBenchmark) }); 15 | switcher.Run(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Scenarios/Combined.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace DependencyInjectorBenchmarks.Scenarios 4 | { 5 | public interface ICombined 6 | { 7 | 8 | } 9 | 10 | public class Combined : ICombined 11 | { 12 | private readonly ISingleton _singleton; 13 | private readonly ITransient _transient; 14 | 15 | public Combined(ISingleton stateless, ITransient stateful) 16 | { 17 | if (stateless == null) 18 | { 19 | throw new ArgumentNullException(nameof(stateless)); 20 | } 21 | 22 | if (stateful == null) 23 | { 24 | throw new ArgumentNullException(nameof(stateful)); 25 | } 26 | 27 | _singleton = stateless; 28 | _transient = stateful; 29 | } 30 | } 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Scenarios/Singleton.cs: -------------------------------------------------------------------------------- 1 | namespace DependencyInjectorBenchmarks.Scenarios 2 | { 3 | public interface ISingleton 4 | { 5 | } 6 | 7 | public class Singleton : ISingleton 8 | { 9 | public static readonly ISingleton Instance = new Singleton(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/Scenarios/Transient.cs: -------------------------------------------------------------------------------- 1 | namespace DependencyInjectorBenchmarks.Scenarios 2 | { 3 | public interface ITransient 4 | { 5 | } 6 | 7 | public class Transient : ITransient 8 | { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/SingletonBenchmark.cs: -------------------------------------------------------------------------------- 1 | using BenchmarkDotNet.Attributes; 2 | using BenchmarkDotNet.Attributes.Exporters; 3 | using BenchmarkDotNet.Order; 4 | using DependencyInjectorBenchmarks.Containers; 5 | using DependencyInjectorBenchmarks.Scenarios; 6 | 7 | namespace DependencyInjectorBenchmarks 8 | { 9 | [MemoryDiagnoser] 10 | [OrderProvider(SummaryOrderPolicy.FastestToSlowest, MethodOrderPolicy.Declared)] 11 | [MarkdownExporter] 12 | public class SingletonBenchmark 13 | { 14 | [Benchmark(Baseline = true)] 15 | public ISingleton Direct() => DirectBenchmark.Instance.ResolveSingleton(); 16 | 17 | [Benchmark] 18 | public ISingleton SimpleInjector() => SimpleInjectorBenchmark.Instance.ResolveSingleton(); 19 | 20 | [Benchmark] 21 | public ISingleton Ninject() => NinjectBenchmark.Instance.ResolveSingleton(); 22 | 23 | [Benchmark] 24 | public ISingleton Autofac() => AutofacBenchmark.Instance.ResolveSingleton(); 25 | 26 | [Benchmark] 27 | public ISingleton AspNetCore() => AspNetCoreBenchmark.Instance.ResolveSingleton(); 28 | 29 | [Benchmark] 30 | public ISingleton CastleWindsor() => CastleWindsorBenchmark.Instance.ResolveSingleton(); 31 | 32 | [Benchmark] 33 | public ISingleton LightInject() => LightInjectBenchmark.Instance.ResolveSingleton(); 34 | 35 | [Benchmark] 36 | public ISingleton StructureMap() => StructureMapBenchmark.Instance.ResolveSingleton(); 37 | 38 | [Benchmark] 39 | public ISingleton FsContainer() => FsContainerBenchmark.Instance.ResolveSingleton(); 40 | 41 | [Benchmark] 42 | public ISingleton DryIoc() => DryIocBenchmark.Instance.ResolveSingleton(); 43 | 44 | [Benchmark] 45 | public ISingleton Unity() => UnityBenchmark.Instance.ResolveSingleton(); 46 | 47 | [Benchmark] 48 | public ISingleton MicroResolver() => MicroResolverBenchmark.Instance.ResolveSingleton(); 49 | 50 | [Benchmark] 51 | public ISingleton Grace() => GraceBenchmark.Instance.ResolveSingleton(); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/DependencyInjectorBenchmarks/TransientBenchmark.cs: -------------------------------------------------------------------------------- 1 | using BenchmarkDotNet.Attributes; 2 | using BenchmarkDotNet.Attributes.Exporters; 3 | using BenchmarkDotNet.Order; 4 | using DependencyInjectorBenchmarks.Containers; 5 | using DependencyInjectorBenchmarks.Scenarios; 6 | 7 | namespace DependencyInjectorBenchmarks 8 | { 9 | [MemoryDiagnoser] 10 | [OrderProvider(SummaryOrderPolicy.FastestToSlowest, MethodOrderPolicy.Declared)] 11 | [MarkdownExporter] 12 | public class TransientBenchmark 13 | { 14 | [Benchmark(Baseline = true)] 15 | public ITransient Direct() => DirectBenchmark.Instance.ResolveTransient(); 16 | 17 | [Benchmark] 18 | public ITransient SimpleInjector() => SimpleInjectorBenchmark.Instance.ResolveTransient(); 19 | 20 | [Benchmark] 21 | public ITransient Ninject() => NinjectBenchmark.Instance.ResolveTransient(); 22 | 23 | [Benchmark] 24 | public ITransient Autofac() => AutofacBenchmark.Instance.ResolveTransient(); 25 | 26 | [Benchmark] 27 | public ITransient AspNetCore() => AspNetCoreBenchmark.Instance.ResolveTransient(); 28 | 29 | [Benchmark] 30 | public ITransient CastleWindsor() => CastleWindsorBenchmark.Instance.ResolveTransient(); 31 | 32 | [Benchmark] 33 | public ITransient LightInject() => LightInjectBenchmark.Instance.ResolveTransient(); 34 | 35 | [Benchmark] 36 | public ITransient StructureMap() => StructureMapBenchmark.Instance.ResolveTransient(); 37 | 38 | [Benchmark] 39 | public ITransient FsContainer() => FsContainerBenchmark.Instance.ResolveTransient(); 40 | 41 | [Benchmark] 42 | public ITransient DryIoc() => DryIocBenchmark.Instance.ResolveTransient(); 43 | 44 | [Benchmark] 45 | public ITransient Unity() => UnityBenchmark.Instance.ResolveTransient(); 46 | 47 | [Benchmark] 48 | public ITransient MicroResolver() => MicroResolverBenchmark.Instance.ResolveTransient(); 49 | 50 | [Benchmark] 51 | public ITransient Grace() => GraceBenchmark.Instance.ResolveTransient(); 52 | } 53 | } 54 | --------------------------------------------------------------------------------