-
Notifications
You must be signed in to change notification settings - Fork 268
/
GetServiceBenchmark.cs
140 lines (119 loc) · 4.63 KB
/
GetServiceBenchmark.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using BenchmarkDotNet.Attributes;
using MicroBenchmarks;
namespace Microsoft.Extensions.DependencyInjection
{
[BenchmarkCategory(Categories.Libraries)]
public class GetService : ServiceProviderEngineBenchmark
{
private IServiceProvider _transientSp;
private IServiceScope _scopedSp;
private IServiceProvider _singletonSp;
private IServiceProvider _serviceScopeFactoryProvider;
private IServiceProvider _serviceScope;
private IServiceProvider _emptyEnumerable;
[Benchmark(Baseline = true)]
public A NoDI() => new A(new B(new C()));
[GlobalSetup(Target = nameof(Transient))]
public void SetupTransient()
{
var services = new ServiceCollection();
services.AddTransient<A>();
services.AddTransient<B>();
services.AddTransient<C>();
_transientSp = services.BuildServiceProvider(new ServiceProviderOptions()
{
#if INTERNAL_DI
Mode = ServiceProviderMode
#endif
});
}
[Benchmark]
public A Transient() => _transientSp.GetService<A>();
[GlobalCleanup(Target = nameof(Transient))]
public void CleanupTransient() => ((IDisposable)_transientSp).Dispose();
[GlobalSetup(Target = nameof(Scoped))]
public void SetupScoped()
{
var services = new ServiceCollection();
services.AddScoped<A>();
services.AddScoped<B>();
services.AddScoped<C>();
_scopedSp = services.BuildServiceProvider(new ServiceProviderOptions()
{
#if INTERNAL_DI
Mode = ServiceProviderMode
#endif
}).CreateScope();
}
[Benchmark]
[MemoryRandomization]
public A Scoped() => _scopedSp.ServiceProvider.GetService<A>();
[GlobalCleanup(Target = nameof(Scoped))]
public void CleanupScoped() => ((IDisposable)_scopedSp).Dispose();
[GlobalSetup(Target = nameof(Singleton))]
public void SetupScopedSingleton()
{
var services = new ServiceCollection();
services.AddSingleton<A>();
services.AddSingleton<B>();
services.AddSingleton<C>();
_singletonSp = services.BuildServiceProvider(new ServiceProviderOptions()
{
#if INTERNAL_DI
Mode = ServiceProviderMode
#endif
});
}
[Benchmark]
public A Singleton() => _singletonSp.GetService<A>();
[GlobalCleanup(Target = nameof(Singleton))]
public void CleanupSingleton() => ((IDisposable)_singletonSp).Dispose();
[GlobalSetup(Target = nameof(ServiceScope))]
public void ServiceScopeSetup()
{
_serviceScope = new ServiceCollection().BuildServiceProvider(new ServiceProviderOptions()
{
#if INTERNAL_DI
Mode = ServiceProviderMode
#endif
});
}
[Benchmark]
public IServiceScope ServiceScope() => _serviceScope.CreateScope();
[GlobalCleanup(Target = nameof(ServiceScope))]
public void ServiceScopeCleanup() => ((IDisposable)_serviceScope).Dispose();
[GlobalSetup(Target = nameof(ServiceScopeProvider))]
public void ServiceScopeProviderSetup()
{
_serviceScopeFactoryProvider = new ServiceCollection().BuildServiceProvider(new ServiceProviderOptions()
{
#if INTERNAL_DI
Mode = ServiceProviderMode
#endif
});
}
[Benchmark]
public IServiceScopeFactory ServiceScopeProvider() => _serviceScopeFactoryProvider.GetService<IServiceScopeFactory>();
[GlobalCleanup(Target = nameof(ServiceScopeProvider))]
public void ServiceScopeProviderTransient() => ((IDisposable)_serviceScopeFactoryProvider).Dispose();
[GlobalSetup(Target = nameof(EmptyEnumerable))]
public void EmptyEnumerableSetup()
{
_emptyEnumerable = new ServiceCollection().BuildServiceProvider(new ServiceProviderOptions()
{
#if INTERNAL_DI
Mode = ServiceProviderMode
#endif
});
}
[Benchmark]
public object EmptyEnumerable() =>_emptyEnumerable.GetService<IEnumerable<A>>();
[GlobalCleanup(Target = nameof(EmptyEnumerable))]
public void EmptyEnumerableCleanup() => ((IDisposable)_emptyEnumerable).Dispose();
}
}