IoC |
, , , , Stef'an J"okull Sigurdarson IoC , .NET Core, BenchmarkDotNet instance resolving performance. FsContainer.
.NET Core ( , ) , , . - - 20 .
:
public object Resolve(Type type)
{
var instance = _bindingResolver.Resolve(this, GetBindings(), type);
if (!_disposeManager.Contains(instance))
{
_disposeManager.Add(instance);
}
return instance;
}
, benchmark'- ( ), , Resolve
. , resolve instance _disposeManager
container.Dispose()
. .. List
, Contains
, , 2 side-effect'a:
, , , , , ( ) _disposeManager
, IDisposable
.
if (instance is IDisposable && !_disposeManager.Contains(instance))
{
_disposeManager.Add(instance);
}
, :
Method | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Gen 1 | Allocated |
---|---|---|---|---|---|---|---|---|
Direct | 13.77 ns | 0.3559 ns | 0.3655 ns | 1.00 | 0.00 | 0.0178 | - | 56 B |
LightInject | 36.95 ns | 0.1081 ns | 0.0902 ns | 2.69 | 0.07 | 0.0178 | - | 56 B |
SimpleInjector | 46.17 ns | 0.2746 ns | 0.2434 ns | 3.35 | 0.09 | 0.0178 | - | 56 B |
AspNetCore | 71.09 ns | 0.4592 ns | 0.4296 ns | 5.17 | 0.14 | 0.0178 | - | 56 B |
Autofac | 1,600.67 ns | 14.4742 ns | 12.8310 ns | 116.32 | 3.10 | 0.5741 | - | 1803 B |
StructureMap | 1,815.87 ns | 18.2271 ns | 16.1578 ns | 131.95 | 3.55 | 0.6294 | - | 1978 B |
FsContainer | 2,819.01 ns | 6.0161 ns | 5.3331 ns | 204.85 | 5.24 | 0.4845 | - | 1524 B |
Ninject | 12,812.70 ns | 255.5191 ns | 447.5211 ns | 931.06 | 39.95 | 1.7853 | 0.4425 | 5767 B |
.
, , . ConcurrentDictionary
, (Resolve
), - , .
private readonly IDictionary> _ctorCache =
new ConcurrentDictionary>();
, 30%:
Method | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
---|---|---|---|---|---|---|---|---|---|
Direct | 13.50 ns | 0.2240 ns | 0.1986 ns | 1.00 | 0.00 | 0.0178 | - | - | 56 B |
LightInject | 36.94 ns | 0.0999 ns | 0.0886 ns | 2.74 | 0.04 | 0.0178 | - | - | 56 B |
SimpleInjector | 46.40 ns | 0.3409 ns | 0.3189 ns | 3.44 | 0.05 | 0.0178 | - | - | 56 B |
AspNetCore | 70.26 ns | 0.4897 ns | 0.4581 ns | 5.21 | 0.08 | 0.0178 | - | - | 56 B |
Autofac | 1,634.89 ns | 15.3160 ns | 14.3266 ns | 121.14 | 2.01 | 0.5741 | - | - | 1803 B |
FsContainer | 1,779.12 ns | 18.9507 ns | 17.7265 ns | 131.83 | 2.27 | 0.2441 | - | - | 774 B |
StructureMap | 1,830.01 ns | 5.4174 ns | 4.8024 ns | 135.60 | 1.97 | 0.6294 | - | - | 1978 B |
Ninject | 12,558.59 ns | 268.1920 ns | 490.4042 ns | 930.58 | 38.29 | 1.7858 | 0.4423 | 0.0005 | 5662 B |
, BenchmarkDotNet , ( Debug). , , nuget package , , nuget pack:
nuget pack MyProject.csproj -properties Configuration=Release
, package Debug, 25%.
Method | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
---|---|---|---|---|---|---|---|---|---|
Direct | 13.38 ns | 0.2216 ns | 0.2073 ns | 1.00 | 0.00 | 0.0178 | - | - | 56 B |
LightInject | 36.85 ns | 0.0577 ns | 0.0511 ns | 2.75 | 0.04 | 0.0178 | - | - | 56 B |
SimpleInjector | 46.56 ns | 0.5329 ns | 0.4724 ns | 3.48 | 0.06 | 0.0178 | - | - | 56 B |
AspNetCore | 70.17 ns | 0.1403 ns | 0.1312 ns | 5.25 | 0.08 | 0.0178 | - | - | 56 B |
FsContainer | 1,271.81 ns | 4.0828 ns | 3.8190 ns | 95.09 | 1.44 | 0.2460 | - | - | 774 B |
Autofac | 1,648.52 ns | 2.3197 ns | 2.0563 ns | 123.26 | 1.84 | 0.5741 | - | - | 1803 B |
StructureMap | 1,829.05 ns | 17.8238 ns | 16.6724 ns | 136.75 | 2.37 | 0.6294 | - | - | 1978 B |
Ninject | 12,520.08 ns | 248.2530 ns | 534.3907 ns | 936.10 | 41.98 | 1.7860 | 0.4423 | 0.0008 | 5662 B |
, Expression:
private readonly IDictionary> _activatorCache =
new ConcurrentDictionary>();
ConstructorInfo
ParameterInfo[]
, lambda:
private Func GetActivator(ConstructorInfo ctor, ParameterInfo[] parameters) {
var p = Expression.Parameter(typeof(object[]), "args");
var args = new Expression[parameters.Length];
for (var i = 0; i < parameters.Length; i++)
{
var a = Expression.ArrayAccess(p, Expression.Constant(i));
args[i] = Expression.Convert(a, parameters[i].ParameterType);
}
var b = Expression.New(ctor, args);
var l = Expression.Lambda>(b, p);
return l.Compile();
}
, Resolve, Activator, 10% , 5- :
Method | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
---|---|---|---|---|---|---|---|---|---|
Direct | 13.24 ns | 0.0836 ns | 0.0698 ns | 1.00 | 0.00 | 0.0178 | - | - | 56 B |
LightInject | 37.39 ns | 0.0570 ns | 0.0533 ns | 2.82 | 0.01 | 0.0178 | - | - | 56 B |
SimpleInjector | 46.22 ns | 0.2327 ns | 0.2063 ns | 3.49 | 0.02 | 0.0178 | - | - | 56 B |
AspNetCore | 70.53 ns | 0.2885 ns | 0.2698 ns | 5.33 | 0.03 | 0.0178 | - | - | 56 B |
FsContainer | 1,038.13 ns | 17.1037 ns | 15.9988 ns | 78.41 | 1.23 | 0.2327 | - | - | 734 B |
Autofac | 1,551.33 ns | 3.6293 ns | 3.2173 ns | 117.17 | 0.64 | 0.5741 | - | - | 1803 B |
StructureMap | 1,944.35 ns | 1.8665 ns | 1.7459 ns | 146.85 | 0.76 | 0.6294 | - | - | 1978 B |
Ninject | 13,139.70 ns | 260.8754 ns | 508.8174 ns | 992.43 | 38.35 | 1.7857 | 0.4425 | 0.0004 | 5682 B |
. Github, . IL Direct- 4, .
Method | Mean | Error | StdDev | Gen 0 | Allocated |
---|---|---|---|---|---|
Direct | 4.031 ns | 0.1588 ns | 0.1890 ns | 0.0076 | 24 B |
CompiledInvoke | 85.541 ns | 0.5319 ns | 0.4715 ns | 0.0178 | 56 B |
ConstructorInfoInvoke | 316.088 ns | 1.8337 ns | 1.6256 ns | 0.0277 | 88 B |
ActivatorCreateInstance | 727.547 ns | 2.9228 ns | 2.5910 ns | 0.1316 | 416 B |
DynamicInvoke | 974.699 ns | 5.5867 ns | 5.2258 ns | 0.0515 | 168 B |