1+ namespace Docker . DotNet . Benchmarks ;
2+
3+ [ MemoryDiagnoser ]
4+ public class DockerDaemonRoundtripBenchmarks
5+ {
6+ private readonly string _imageReference = "busybox:1.37" ;
7+
8+ private DockerClient _client = null ! ;
9+
10+ [ GlobalSetup ]
11+ public async Task GlobalSetup ( )
12+ {
13+ #if DOCKER_DOTNET_RELEASE
14+ const string implementation = "release" ;
15+ #else
16+ const string implementation = "main" ;
17+ #endif
18+
19+ var builder = new DockerClientBuilder ( ) ;
20+
21+ _client = builder . Build ( ) ;
22+
23+ Console . WriteLine ( $ "Running daemon round-trip benchmarks against: { implementation } ") ;
24+
25+ await _client . System . PingAsync ( CancellationToken . None )
26+ . ConfigureAwait ( false ) ;
27+
28+ await EnsureImageExistsAsync ( )
29+ . ConfigureAwait ( false ) ;
30+ }
31+
32+ [ GlobalCleanup ]
33+ public void GlobalCleanup ( )
34+ {
35+ _client . Dispose ( ) ;
36+ }
37+
38+ [ Benchmark ]
39+ public async Task < int > CreateContainerRequestResponse ( )
40+ {
41+ var parameters = new CreateContainerParameters ( ) ;
42+ parameters . Name = $ "dockerdotnet-benchmark-{ Guid . NewGuid ( ) : N} ";
43+ parameters . Image = _imageReference ;
44+ parameters . Cmd = [ "sh" , "-c" , "sleep 1" ] ;
45+ parameters . Labels = new Dictionary < string , string > ( ) ;
46+ parameters . Labels . Add ( "suite" , "benchmark" ) ;
47+ parameters . Labels . Add ( "scenario" , "create-roundtrip" ) ;
48+
49+ var response = await _client . Containers . CreateContainerAsync ( parameters , CancellationToken . None )
50+ . ConfigureAwait ( false ) ;
51+
52+ try
53+ {
54+ return response . ID . Length ;
55+ }
56+ finally
57+ {
58+ await SafeRemoveContainerAsync ( response . ID )
59+ . ConfigureAwait ( false ) ;
60+ }
61+ }
62+
63+ [ Benchmark ]
64+ public async Task < bool > StartContainerRequestResponse ( )
65+ {
66+ var parameters = new CreateContainerParameters ( ) ;
67+ parameters . Name = $ "dockerdotnet-benchmark-{ Guid . NewGuid ( ) : N} ";
68+ parameters . Image = _imageReference ;
69+ parameters . Cmd = [ "sh" , "-c" , "exit 0" ] ;
70+ parameters . Labels = new Dictionary < string , string > ( ) ;
71+ parameters . Labels . Add ( "suite" , "benchmark" ) ;
72+ parameters . Labels . Add ( "scenario" , "start-roundtrip" ) ;
73+
74+ var response = await _client . Containers . CreateContainerAsync ( parameters , CancellationToken . None )
75+ . ConfigureAwait ( false ) ;
76+
77+ try
78+ {
79+ return await _client . Containers . StartContainerAsync ( response . ID , new ContainerStartParameters ( ) , CancellationToken . None )
80+ . ConfigureAwait ( false ) ;
81+ }
82+ finally
83+ {
84+ await SafeRemoveContainerAsync ( response . ID )
85+ . ConfigureAwait ( false ) ;
86+ }
87+ }
88+
89+ private async Task EnsureImageExistsAsync ( )
90+ {
91+ var parameters = new ImagesCreateParameters ( ) ;
92+ parameters . FromImage = _imageReference ;
93+
94+ await _client . Images . CreateImageAsync ( parameters , new AuthConfig ( ) , new Progress < JSONMessage > ( _ => { } ) , CancellationToken . None )
95+ . ConfigureAwait ( false ) ;
96+ }
97+
98+ private async Task SafeRemoveContainerAsync ( string containerId )
99+ {
100+ var parameters = new ContainerRemoveParameters ( ) ;
101+ parameters . Force = true ;
102+
103+ try
104+ {
105+ await _client . Containers . RemoveContainerAsync ( containerId , parameters , CancellationToken . None )
106+ . ConfigureAwait ( false ) ;
107+ }
108+ catch ( DockerContainerNotFoundException )
109+ {
110+ }
111+ }
112+ }
0 commit comments