Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions Docker.DotNet.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<File Path="README.md" />
</Folder>
<Folder Name="/src/">
<File Path="src/Directory.Build.props" />
<File Path="src/Directory.Build.targets" />
<Project Path="src/Docker.DotNet.BasicAuth/Docker.DotNet.BasicAuth.csproj" />
<Project Path="src/Docker.DotNet.Handler.Abstractions/Docker.DotNet.Handler.Abstractions.csproj" />
<Project Path="src/Docker.DotNet.LegacyHttp/Docker.DotNet.LegacyHttp.csproj" />
Expand All @@ -15,10 +17,9 @@
<Project Path="src/Docker.DotNet.X509/Docker.DotNet.X509.csproj" />
<Project Path="src/Docker.DotNet/Docker.DotNet.csproj" />
<Project Path="src/Microsoft.Net.Http.Client/Microsoft.Net.Http.Client.csproj" />
<File Path="src/Directory.Build.props" />
<File Path="src/Directory.Build.targets" />
</Folder>
<Folder Name="/test/">
<Project Path="test/Docker.DotNet.Benchmarks/Docker.DotNet.Benchmarks.csproj" />
<Project Path="test/Docker.DotNet.Tests/Docker.DotNet.Tests.csproj" />
<Project Path="test/Docker.DotNet.TestsV2/Docker.DotNet.TestsV2.csproj" />
</Folder>
Expand Down
44 changes: 44 additions & 0 deletions test/Docker.DotNet.Benchmarks/Docker.DotNet.Benchmarks.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
<OutputType>Exe</OutputType>
<IsPackable>false</IsPackable>
<IsPublishable>false</IsPublishable>
</PropertyGroup>
<PropertyGroup>
<DockerDotNetReleaseVersion Condition="'$(DockerDotNetReleaseVersion)' == ''">3.132.0</DockerDotNetReleaseVersion>
<UseReleasedPackage Condition="'$(UseReleasedPackage)' == ''">false</UseReleasedPackage>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" VersionOverride="0.15.8" />
</ItemGroup>
<Choose>
<When Condition="'$(UseReleasedPackage)' == 'true'">
<PropertyGroup>
<DefineConstants>$(DefineConstants);DOCKER_DOTNET_RELEASE</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Docker.DotNet.Enhanced" VersionOverride="$(DockerDotNetReleaseVersion)" />
</ItemGroup>
</When>
<Otherwise>
<PropertyGroup>
<DefineConstants>$(DefineConstants);DOCKER_DOTNET_MAIN</DefineConstants>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../../src/Docker.DotNet/Docker.DotNet.csproj" />
</ItemGroup>
</Otherwise>
</Choose>
<ItemGroup>
<Using Include="System" />
<Using Include="System.Collections.Generic" />
<Using Include="System.Threading" />
<Using Include="System.Threading.Tasks" />
<Using Include="BenchmarkDotNet.Attributes" />
<Using Include="BenchmarkDotNet.Running" />
<Using Include="Docker.DotNet" />
<Using Include="Docker.DotNet.Benchmarks" />
<Using Include="Docker.DotNet.Models" />
</ItemGroup>
</Project>
112 changes: 112 additions & 0 deletions test/Docker.DotNet.Benchmarks/DockerDaemonRoundtripBenchmarks.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
namespace Docker.DotNet.Benchmarks;

[MemoryDiagnoser]
public class DockerDaemonRoundtripBenchmarks
{
private readonly string _imageReference = "busybox:1.37";

private DockerClient _client = null!;

[GlobalSetup]
public async Task GlobalSetup()
{
#if DOCKER_DOTNET_RELEASE
const string implementation = "release";
#else
const string implementation = "main";
#endif

var builder = new DockerClientBuilder();

_client = builder.Build();

Console.WriteLine($"Running daemon round-trip benchmarks against: {implementation}");

await _client.System.PingAsync(CancellationToken.None)
.ConfigureAwait(false);

await EnsureImageExistsAsync()
.ConfigureAwait(false);
}

[GlobalCleanup]
public void GlobalCleanup()
{
_client.Dispose();
}

[Benchmark]
public async Task<int> CreateContainerRequestResponse()
{
var parameters = new CreateContainerParameters();
parameters.Name = $"dockerdotnet-benchmark-{Guid.NewGuid():N}";
parameters.Image = _imageReference;
parameters.Cmd = ["sh", "-c", "sleep 1"];
parameters.Labels = new Dictionary<string, string>();
parameters.Labels.Add("suite", "benchmark");
parameters.Labels.Add("scenario", "create-roundtrip");

var response = await _client.Containers.CreateContainerAsync(parameters, CancellationToken.None)
.ConfigureAwait(false);

try
{
return response.ID.Length;
}
finally
{
await SafeRemoveContainerAsync(response.ID)
.ConfigureAwait(false);
}
}

[Benchmark]
public async Task<bool> StartContainerRequestResponse()
{
var parameters = new CreateContainerParameters();
parameters.Name = $"dockerdotnet-benchmark-{Guid.NewGuid():N}";
parameters.Image = _imageReference;
parameters.Cmd = ["sh", "-c", "exit 0"];
parameters.Labels = new Dictionary<string, string>();
parameters.Labels.Add("suite", "benchmark");
parameters.Labels.Add("scenario", "start-roundtrip");

var response = await _client.Containers.CreateContainerAsync(parameters, CancellationToken.None)
.ConfigureAwait(false);

try
{
return await _client.Containers.StartContainerAsync(response.ID, new ContainerStartParameters(), CancellationToken.None)
.ConfigureAwait(false);
}
finally
{
await SafeRemoveContainerAsync(response.ID)
.ConfigureAwait(false);
}
}

private async Task EnsureImageExistsAsync()
{
var parameters = new ImagesCreateParameters();
parameters.FromImage = _imageReference;

await _client.Images.CreateImageAsync(parameters, new AuthConfig(), new Progress<JSONMessage>(_ => { }), CancellationToken.None)
.ConfigureAwait(false);
}

private async Task SafeRemoveContainerAsync(string containerId)
{
var parameters = new ContainerRemoveParameters();
parameters.Force = true;

try
{
await _client.Containers.RemoveContainerAsync(containerId, parameters, CancellationToken.None)
.ConfigureAwait(false);
}
catch (DockerContainerNotFoundException)
{
}
}
}
2 changes: 2 additions & 0 deletions test/Docker.DotNet.Benchmarks/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Type[] benchmarks = [typeof(DockerDaemonRoundtripBenchmarks)];
BenchmarkSwitcher.FromTypes(benchmarks).Run(args);
23 changes: 23 additions & 0 deletions test/Docker.DotNet.Benchmarks/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Docker.DotNet Benchmarks

This benchmark project compares the current `main` source code against a released NuGet package by running the same benchmark class twice.

## Run

From the repository root, run `main` first:

```bash
dotnet run -c Release --project test/Docker.DotNet.Benchmarks/Docker.DotNet.Benchmarks.csproj -- --filter '*DockerDaemonRoundtripBenchmarks*'
```

Then run the released NuGet package implementation:

```bash
dotnet run -c Release --project test/Docker.DotNet.Benchmarks/Docker.DotNet.Benchmarks.csproj -p:UseReleasedPackage=true -- --filter '*DockerDaemonRoundtripBenchmarks*'
```

To compare against a different release tag/package version:

```bash
dotnet run -c Release --project test/Docker.DotNet.Benchmarks/Docker.DotNet.Benchmarks.csproj -p:UseReleasedPackage=true -p:DockerDotNetReleaseVersion=3.132.0 -- --filter '*DockerDaemonRoundtripBenchmarks*'
```