├── .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 |
--------------------------------------------------------------------------------