diff --git a/InterceptionBenchmarks/App.config b/InterceptionBenchmarks/App.config index b2393a6..62d70de 100644 --- a/InterceptionBenchmarks/App.config +++ b/InterceptionBenchmarks/App.config @@ -12,11 +12,23 @@ - + - + + + + + + + + + + + + + diff --git a/InterceptionBenchmarks/InterceptionBenchmarks.csproj b/InterceptionBenchmarks/InterceptionBenchmarks.csproj index 01ad1f7..183ca0d 100644 --- a/InterceptionBenchmarks/InterceptionBenchmarks.csproj +++ b/InterceptionBenchmarks/InterceptionBenchmarks.csproj @@ -35,22 +35,34 @@ 4 - - ..\packages\Autofac.3.3.1\lib\net40\Autofac.dll + + ..\packages\Autofac.4.3.0\lib\net45\Autofac.dll True - - ..\packages\Autofac.Extras.DynamicProxy.4.0.0\lib\net451\Autofac.Extras.DynamicProxy.dll + + ..\packages\Autofac.Extras.DynamicProxy.4.1.0\lib\net45\Autofac.Extras.DynamicProxy.dll True - - ..\packages\BenchmarkDotNet.0.9.8\lib\net45\BenchmarkDotNet.dll + + ..\packages\BenchmarkDotNet.0.10.2\lib\net45\BenchmarkDotNet.dll + True + + + ..\packages\BenchmarkDotNet.Core.0.10.2\lib\net45\BenchmarkDotNet.Core.dll + True + + + ..\packages\BenchmarkDotNet.Toolchains.Roslyn.0.10.2\lib\net45\BenchmarkDotNet.Toolchains.Roslyn.dll True ..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll True + + ..\packages\Castle.Windsor.3.4.0\lib\net45\Castle.Windsor.dll + True + ..\packages\LinFu.DynamicProxy.OfficialRelease.1.0.5\lib\net\LinFu.DynamicProxy.dll True @@ -87,8 +99,9 @@ ..\packages\Unity.4.0.1\lib\net45\Microsoft.Practices.Unity.RegistrationByConvention.dll True - - ..\packages\Ninject.3.2.0.0\lib\net45-full\Ninject.dll + + ..\packages\Ninject.3.2.2.0\lib\net45-full\Ninject.dll + True ..\packages\Ninject.Extensions.Interception.3.2.0.0\lib\net45-full\Ninject.Extensions.Interception.dll @@ -101,69 +114,73 @@ ..\packages\Ninject.Extensions.Interception.Linfu.3.2.0.0\lib\net45-full\Ninject.Extensions.Interception.LinFu.dll True - - ..\packages\SimpleInjector.3.1.2\lib\net45\SimpleInjector.dll + + ..\packages\SimpleInjector.3.3.2\lib\net45\SimpleInjector.dll True - ..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll + ..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll True - - ..\packages\System.Collections.Immutable.1.2.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + + ..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll True - - ..\packages\System.Console.4.0.0\lib\net46\System.Console.dll + + ..\packages\System.Console.4.3.0\lib\net46\System.Console.dll True - - ..\packages\System.Diagnostics.FileVersionInfo.4.0.0\lib\net46\System.Diagnostics.FileVersionInfo.dll + + ..\packages\System.Diagnostics.FileVersionInfo.4.3.0\lib\net46\System.Diagnostics.FileVersionInfo.dll True - - ..\packages\System.Diagnostics.StackTrace.4.0.1\lib\net46\System.Diagnostics.StackTrace.dll + + ..\packages\System.Diagnostics.StackTrace.4.3.0\lib\net46\System.Diagnostics.StackTrace.dll True - - ..\packages\System.IO.FileSystem.4.0.1\lib\net46\System.IO.FileSystem.dll + + ..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll True - - ..\packages\System.IO.FileSystem.Primitives.4.0.1\lib\net46\System.IO.FileSystem.Primitives.dll + + ..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll True - - ..\packages\System.Reflection.Metadata.1.3.0\lib\portable-net45+win8\System.Reflection.Metadata.dll + + ..\packages\System.Reflection.Metadata.1.4.2\lib\portable-net45+win8\System.Reflection.Metadata.dll True - ..\packages\System.Security.Cryptography.Algorithms.4.2.0\lib\net461\System.Security.Cryptography.Algorithms.dll + ..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll + True + + + ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll True - - ..\packages\System.Security.Cryptography.Encoding.4.0.0\lib\net46\System.Security.Cryptography.Encoding.dll + + ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll True - - ..\packages\System.Security.Cryptography.Primitives.4.0.0\lib\net46\System.Security.Cryptography.Primitives.dll + + ..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll True - - ..\packages\System.Security.Cryptography.X509Certificates.4.1.0\lib\net461\System.Security.Cryptography.X509Certificates.dll + + ..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll True - - ..\packages\System.Text.Encoding.CodePages.4.0.1\lib\net46\System.Text.Encoding.CodePages.dll + + ..\packages\System.Threading.Tasks.Extensions.4.3.0\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll True - - ..\packages\System.Threading.Thread.4.0.0\lib\net46\System.Threading.Thread.dll + + ..\packages\System.Threading.Thread.4.3.0\lib\net46\System.Threading.Thread.dll True @@ -172,16 +189,20 @@ - - ..\packages\System.Xml.XmlDocument.4.0.1\lib\net46\System.Xml.XmlDocument.dll + + ..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll + True + + + ..\packages\System.Xml.XmlDocument.4.3.0\lib\net46\System.Xml.XmlDocument.dll True - - ..\packages\System.Xml.XPath.4.0.1\lib\net46\System.Xml.XPath.dll + + ..\packages\System.Xml.XPath.4.3.0\lib\net46\System.Xml.XPath.dll True - - ..\packages\System.Xml.XPath.XDocument.4.0.1\lib\net46\System.Xml.XPath.XDocument.dll + + ..\packages\System.Xml.XPath.XDocument.4.3.0\lib\net46\System.Xml.XPath.XDocument.dll True @@ -208,6 +229,9 @@ + + + diff --git a/InterceptionBenchmarks/Program.cs b/InterceptionBenchmarks/Program.cs index 0fca72c..c01cda0 100644 --- a/InterceptionBenchmarks/Program.cs +++ b/InterceptionBenchmarks/Program.cs @@ -1,4 +1,6 @@ using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Attributes.Jobs; +using BenchmarkDotNet.Order; using BenchmarkDotNet.Running; namespace InterceptionBenchmarks @@ -11,7 +13,8 @@ static void Main() } } - [Config("columns=Place")] + [OrderProvider(SummaryOrderPolicy.FastestToSlowest)] + [LegacyJitX86Job, LegacyJitX64Job, RyuJitX64Job] public class Benchmark { private AutofacDecoratorBenchmark _autofacWithDecorator; @@ -25,6 +28,9 @@ public class Benchmark private SimpleInjectorDynamicProxyBenchmark _simpleInjectorWithDynamicProxy; private UnityDecoratorBenchmark _unityWithDecorator; private UnityInterceptionBenchmark _unityWithUnityInterception; + private WindsorBenchmark _windsor; + private WindsorDecoratorBenchmark _windsorWithDecorator; + private WindsorDynamicProxyBenchmark _windsorWithDynamicProxy; [Setup] public void Initialize() @@ -40,6 +46,9 @@ public void Initialize() _ninjectWithDecorator = new NinjectDecoratorBenchmark(); _ninjectWithDynamicProxy = new NinjectDynamicProxyBenchmark(); _ninjectWithLinFu = new NinjectLinFuBenchmark(); + _windsor = new WindsorBenchmark(); + _windsorWithDecorator = new WindsorDecoratorBenchmark(); + _windsorWithDynamicProxy = new WindsorDynamicProxyBenchmark(); } [Benchmark] @@ -115,5 +124,23 @@ public void NinjectLinFu() { _ninjectWithLinFu.Run(); } + + [Benchmark] + public void Windsor() + { + _windsor.Run(); + } + + [Benchmark] + public void WindsorWithDecorator() + { + _windsorWithDecorator.Run(); + } + + [Benchmark] + public void WindsorWithDynamicProxy() + { + _windsorWithDynamicProxy.Run(); + } } } \ No newline at end of file diff --git a/InterceptionBenchmarks/WindsorBenchmark.cs b/InterceptionBenchmarks/WindsorBenchmark.cs new file mode 100644 index 0000000..fab584c --- /dev/null +++ b/InterceptionBenchmarks/WindsorBenchmark.cs @@ -0,0 +1,23 @@ +using Castle.MicroKernel.Registration; +using Castle.Windsor; + +namespace InterceptionBenchmarks +{ + internal sealed class WindsorBenchmark + { + private readonly IWindsorContainer _container; + + public WindsorBenchmark() + { + _container = new WindsorContainer(); + _container.Register(Component.For().ImplementedBy()); + } + + public void Run() + { + var something = _container.Resolve(); + + something.Foo(); + } + } +} \ No newline at end of file diff --git a/InterceptionBenchmarks/WindsorDecoratorBenchmark.cs b/InterceptionBenchmarks/WindsorDecoratorBenchmark.cs new file mode 100644 index 0000000..5f570c5 --- /dev/null +++ b/InterceptionBenchmarks/WindsorDecoratorBenchmark.cs @@ -0,0 +1,24 @@ +using Castle.MicroKernel.Registration; +using Castle.Windsor; + +namespace InterceptionBenchmarks +{ + internal sealed class WindsorDecoratorBenchmark + { + private readonly IWindsorContainer _container; + + public WindsorDecoratorBenchmark() + { + _container = new WindsorContainer(); + _container.Register(Component.For().ImplementedBy()); + _container.Register(Component.For().ImplementedBy()); + } + + public void Run() + { + var something = _container.Resolve(); + + something.Foo(); + } + } +} \ No newline at end of file diff --git a/InterceptionBenchmarks/WindsorDynamicProxyBenchmark.cs b/InterceptionBenchmarks/WindsorDynamicProxyBenchmark.cs new file mode 100644 index 0000000..9ca4f6c --- /dev/null +++ b/InterceptionBenchmarks/WindsorDynamicProxyBenchmark.cs @@ -0,0 +1,23 @@ +using Castle.MicroKernel.Registration; +using Castle.Windsor; + +namespace InterceptionBenchmarks +{ + internal sealed class WindsorDynamicProxyBenchmark + { + private readonly IWindsorContainer _container; + + public WindsorDynamicProxyBenchmark() + { + _container = new WindsorContainer(); + _container.Register(Component.For().LifestyleTransient()); + _container.Register(Component.For().ImplementedBy().LifestyleTransient().Interceptors()); + } + + public void Run() + { + var something = _container.Resolve(); + something.Foo(); + } + } +} \ No newline at end of file diff --git a/InterceptionBenchmarks/packages.config b/InterceptionBenchmarks/packages.config index 4f3293b..69c2f13 100644 --- a/InterceptionBenchmarks/packages.config +++ b/InterceptionBenchmarks/packages.config @@ -1,59 +1,63 @@  - - - + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 18df6e2..5dc9ca9 100644 --- a/README.md +++ b/README.md @@ -7,30 +7,76 @@ This small research project benchmarks between different IoC frameworks and thei * Castle.DynamicProxy stand-alone * SimpleInjector with MethodTimer.Fody * Autofac with Castle.DynamicProxy +* Castle.Windsor with Castle.DynamicProxy What is being benchmarked is as follows: * Creating or resolving `ISomething`; * Calling `ISomething.Foo` on the resulting object; * Timing the duration of the original method using a `Stopwatch`, either via interception or encapsulation (in a `TimingSomething`). -A benchmark on my machine (i7 6700HQ, 16 GB) results in the following, YMMV: - -Method | Median | StdDev | Scaled | Place | ------------------------------------- |--------------: |-------------: |--------: |-----: | -UsingNew | 53,0475 ns | 1,2048 ns | 1,00 | 1 | -UsingSimpleInjector | 119,8636 ns | 2,9011 ns | 2,26 | 2 | -UsingSimpleInjectorWithFody | 456,7976 ns | 16,0940 ns | 8,61 | 3 | -UsingUnity | 995,3501 ns | 53,7859 ns | 18,76 | 4 | -UsingAutofac | 1 192,0763 ns | 72,7590 ns | 22,47 | 5 | -UsingDynamicProxyWithoutIoc | 4 219,4526 ns | 44,2089 ns | 79,54 | 6 | -UsingSimpleInjectorWithInterception | 4 605,1258 ns | 329,7238 ns | 86,81 | 7 | -UsingNinjectWithLinFuMethodInterception | 10 071,2066 ns | 573,8851 ns | 189,85 | 8 | -UsingNinjectWithDynamicProxyMethodInterception | 10 239,9290 ns | 334,3963 ns | 193,03 | 8 | -UsingNinject | 14 638,0324 ns | 1 104,9395 ns | 275,94 | 9 | -UsingAutofacWithInterception | 15 580,4160 ns | 800,6822 ns | 293,71 | 9 | -UsingNinjectWithLinFuInterceptorInterception | 16 633,1512 ns | 835,7362 ns | 313,55 | 9 | -UsingNinjectWithDynamicProxyInterceptorInterception | 20 548,4465 ns | 1 030,3296 ns | 387,36 | 10 | -UsingUnityWithInterception | 82 962,1605 ns | 3 280,7292 ns | 1 563,92 | 11 | +A benchmark on my machine results in the following, YMMV: + +``` ini + +BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.1.7601 Service Pack 1 +Processor=Intel(R) Xeon(R) CPU E3-1230 v5 3.40GHz, ProcessorCount=8 +Frequency=3328398 Hz, Resolution=300.4448 ns, Timer=TSC + [Host] : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.6.1590.0 + LegacyJitX64 : Clr 4.0.30319.42000, 64bit LegacyJIT/clrjit-v4.6.1590.0;compatjit-v4.6.1590.0 + RyuJitX64 : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1590.0 + LegacyJitX86 : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.6.1590.0 + +Runtime=Clr + +``` + Method | Job | Jit | Platform | Mean | StdErr | StdDev | Median | Scaled | Scaled-StdDev | Gen 0 | Gen 1 | Allocated | +--------------------------- |------------- |---------- |--------- |--------------- |------------ |-------------- |--------------- |--------- |-------------- |------- |------- |---------- | + NoDIDecorator | LegacyJitX64 | LegacyJit | X64 | 43.0763 ns | 0.1139 ns | 0.4107 ns | 43.1737 ns | 1.00 | 0.00 | 0.0193 | - | 88 B | + NoDIDecorator | RyuJitX64 | RyuJit | X64 | 43.3912 ns | 0.2033 ns | 0.7874 ns | 43.8227 ns | 1.00 | 0.00 | 0.0197 | - | 88 B | + NoDIDecorator | LegacyJitX86 | LegacyJit | X86 | 45.6236 ns | 0.2585 ns | 0.9322 ns | 45.3657 ns | 1.00 | 0.00 | 0.0121 | - | 52 B | + SimpleInjectorDecorator | RyuJitX64 | RyuJit | X64 | 99.2894 ns | 0.4042 ns | 1.5655 ns | 98.8286 ns | 2.29 | 0.05 | 0.0143 | - | 88 B | + SimpleInjectorDecorator | LegacyJitX64 | LegacyJit | X64 | 105.7991 ns | 0.2137 ns | 0.7704 ns | 105.7662 ns | 2.46 | 0.03 | 0.0140 | - | 88 B | + SimpleInjectorDecorator | LegacyJitX86 | LegacyJit | X86 | 107.7937 ns | 1.1813 ns | 9.7409 ns | 103.7296 ns | 2.36 | 0.22 | 0.0064 | - | 52 B | + Windsor | RyuJitX64 | RyuJit | X64 | 254.7529 ns | 0.6250 ns | 2.4204 ns | 254.8930 ns | 5.87 | 0.12 | 0.0708 | - | 352 B | + Windsor | LegacyJitX86 | LegacyJit | X86 | 267.6785 ns | 1.4470 ns | 5.2173 ns | 267.2205 ns | 5.87 | 0.16 | 0.0307 | - | 184 B | + Windsor | LegacyJitX64 | LegacyJit | X64 | 273.7484 ns | 2.2989 ns | 8.9038 ns | 271.7756 ns | 6.36 | 0.21 | 0.0748 | - | 352 B | + WindsorWithDecorator | LegacyJitX86 | LegacyJit | X86 | 308.7305 ns | 1.1114 ns | 4.0072 ns | 310.0718 ns | 6.77 | 0.16 | 0.0376 | - | 212 B | + WindsorWithDecorator | RyuJitX64 | RyuJit | X64 | 318.1282 ns | 0.9109 ns | 3.5280 ns | 317.3877 ns | 7.33 | 0.15 | 0.0808 | - | 392 B | + WindsorWithDecorator | LegacyJitX64 | LegacyJit | X64 | 320.5461 ns | 2.4803 ns | 9.2804 ns | 316.1341 ns | 7.44 | 0.22 | 0.0798 | - | 392 B | + AutofacDecorator | RyuJitX64 | RyuJit | X64 | 683.5465 ns | 3.9890 ns | 15.4495 ns | 684.6195 ns | 15.76 | 0.44 | 0.2202 | - | 1.03 kB | + AutofacDecorator | LegacyJitX64 | LegacyJit | X64 | 692.3211 ns | 5.2402 ns | 18.8937 ns | 693.4978 ns | 16.07 | 0.45 | 0.2202 | - | 1.03 kB | + AutofacDecorator | LegacyJitX86 | LegacyJit | X86 | 792.5910 ns | 5.2425 ns | 19.6158 ns | 787.7405 ns | 17.38 | 0.53 | 0.1053 | - | 552 B | + UnityDecorator | LegacyJitX64 | LegacyJit | X64 | 863.8761 ns | 2.9232 ns | 10.9377 ns | 861.7129 ns | 20.06 | 0.31 | 0.0946 | - | 584 B | + UnityDecorator | LegacyJitX86 | LegacyJit | X86 | 892.8893 ns | 2.2558 ns | 8.7367 ns | 891.9811 ns | 19.58 | 0.42 | 0.0247 | - | 316 B | + NoDILinFu | RyuJitX64 | RyuJit | X64 | 961.0477 ns | 2.5413 ns | 9.8425 ns | 959.6984 ns | 22.16 | 0.45 | 0.0860 | - | 560 B | + NoDILinFu | LegacyJitX64 | LegacyJit | X64 | 961.8167 ns | 2.1694 ns | 8.1170 ns | 960.1087 ns | 22.33 | 0.27 | 0.0860 | - | 560 B | + NoDILinFu | LegacyJitX86 | LegacyJit | X86 | 1,051.9075 ns | 3.5058 ns | 12.1443 ns | 1,049.1848 ns | 23.06 | 0.51 | 0.0198 | - | 292 B | + UnityDecorator | RyuJitX64 | RyuJit | X64 | 1,078.4906 ns | 5.1637 ns | 17.8876 ns | 1,080.3353 ns | 24.86 | 0.59 | 0.0926 | - | 584 B | + NoDIDynamicProxy | RyuJitX64 | RyuJit | X64 | 3,372.9961 ns | 8.0261 ns | 31.0851 ns | 3,372.7103 ns | 77.76 | 1.54 | 0.1068 | - | 1.23 kB | + NoDIDynamicProxy | LegacyJitX64 | LegacyJit | X64 | 3,414.3847 ns | 14.6465 ns | 54.8023 ns | 3,414.4761 ns | 79.27 | 1.43 | 0.1785 | - | 1.23 kB | + SimpleInjectorDynamicProxy | LegacyJitX64 | LegacyJit | X64 | 3,514.8951 ns | 15.7269 ns | 56.7043 ns | 3,511.6257 ns | 81.60 | 1.47 | 0.1190 | - | 1.23 kB | + SimpleInjectorDynamicProxy | RyuJitX64 | RyuJit | X64 | 3,547.0381 ns | 7.2157 ns | 26.9986 ns | 3,549.6552 ns | 81.77 | 1.56 | 0.1149 | - | 1.23 kB | + NoDIDynamicProxy | LegacyJitX86 | LegacyJit | X86 | 3,815.4190 ns | 12.5903 ns | 45.3951 ns | 3,805.9222 ns | 83.66 | 1.87 | - | - | 636 B | + SimpleInjectorDynamicProxy | LegacyJitX86 | LegacyJit | X86 | 3,979.3641 ns | 17.8181 ns | 64.2442 ns | 3,969.7763 ns | 87.25 | 2.16 | - | - | 636 B | + WindsorWithDynamicProxy | LegacyJitX86 | LegacyJit | X86 | 9,826.7359 ns | 94.0406 ns | 398.9805 ns | 9,680.6008 ns | 215.47 | 9.46 | 0.0773 | - | 1.91 kB | + WindsorWithDynamicProxy | LegacyJitX64 | LegacyJit | X64 | 10,047.3056 ns | 45.6781 ns | 170.9119 ns | 10,023.6441 ns | 233.26 | 4.38 | 0.4903 | - | 3.55 kB | + WindsorWithDynamicProxy | RyuJitX64 | RyuJit | X64 | 10,221.4229 ns | 21.7971 ns | 84.4198 ns | 10,245.0749 ns | 235.64 | 4.56 | 0.5066 | - | 3.55 kB | + AutofacDynamicProxy | LegacyJitX64 | LegacyJit | X64 | 10,317.9270 ns | 23.7183 ns | 85.5175 ns | 10,281.2826 ns | 239.55 | 2.91 | 0.4517 | - | 3.36 kB | + AutofacDynamicProxy | LegacyJitX86 | LegacyJit | X86 | 10,806.0978 ns | 68.8086 ns | 266.4945 ns | 10,697.3650 ns | 236.94 | 7.26 | - | - | 1.8 kB | + AutofacDynamicProxy | RyuJitX64 | RyuJit | X64 | 11,131.9703 ns | 35.4903 ns | 137.4535 ns | 11,083.5459 ns | 256.63 | 5.46 | 0.4517 | - | 3.36 kB | + NinjectDecorator | RyuJitX64 | RyuJit | X64 | 11,620.4688 ns | 36.0525 ns | 134.8962 ns | 11,590.7669 ns | 267.89 | 5.60 | 0.9867 | - | 5.69 kB | + NinjectDecorator | LegacyJitX86 | LegacyJit | X86 | 11,841.6502 ns | 40.3620 ns | 145.5271 ns | 11,832.9489 ns | 259.65 | 5.87 | 0.3357 | 0.0142 | 3.11 kB | + NinjectDecorator | LegacyJitX64 | LegacyJit | X64 | 11,859.4810 ns | 94.8736 ns | 342.0717 ns | 11,821.5368 ns | 275.34 | 8.04 | 0.9949 | - | 5.69 kB | + NinjectLinFu | LegacyJitX86 | LegacyJit | X86 | 14,112.2435 ns | 97.8361 ns | 378.9177 ns | 13,929.8848 ns | 309.44 | 10.00 | 0.3168 | 0.1628 | 3.48 kB | + NinjectLinFu | RyuJitX64 | RyuJit | X64 | 14,220.0373 ns | 107.1863 ns | 415.1309 ns | 14,061.1461 ns | 327.82 | 10.91 | 0.7975 | - | 6.37 kB | + NinjectLinFu | LegacyJitX64 | LegacyJit | X64 | 14,449.1019 ns | 67.3757 ns | 252.0967 ns | 14,401.5457 ns | 335.46 | 6.43 | 0.8301 | - | 6.39 kB | + NinjectDynamicProxy | LegacyJitX86 | LegacyJit | X86 | 17,041.6468 ns | 40.3722 ns | 145.5639 ns | 17,062.8622 ns | 373.67 | 7.82 | 0.1261 | 0.0041 | 3.42 kB | + NinjectDynamicProxy | LegacyJitX64 | LegacyJit | X64 | 18,127.0021 ns | 40.9216 ns | 153.1146 ns | 18,100.6744 ns | 420.85 | 5.17 | 1.0670 | - | 6.27 kB | + NinjectDynamicProxy | RyuJitX64 | RyuJit | X64 | 18,401.2353 ns | 39.0917 ns | 151.4013 ns | 18,372.1004 ns | 424.21 | 8.21 | 0.8301 | - | 6.32 kB | + UnityUnityInterception | LegacyJitX64 | LegacyJit | X64 | 70,888.8519 ns | 110.8290 ns | 399.5996 ns | 70,952.1367 ns | 1,645.80 | 17.57 | 1.1230 | - | 15.61 kB | + UnityUnityInterception | LegacyJitX86 | LegacyJit | X86 | 73,957.9882 ns | 326.4696 ns | 1,221.5376 ns | 73,943.6900 ns | 1,621.66 | 40.52 | - | - | 8.3 kB | + UnityUnityInterception | RyuJitX64 | RyuJit | X64 | 77,903.3277 ns | 763.5970 ns | 3,581.5872 ns | 76,311.4755 ns | 1,795.93 | 86.68 | 2.4414 | - | 15.61 kB | + For reference: