Skip to content

Commit 954d79f

Browse files
feat: Add benchmark project
1 parent b835f6f commit 954d79f

File tree

5 files changed

+136
-0
lines changed

5 files changed

+136
-0
lines changed

Miku.Benchmark/MessageBenchmark.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#pragma warning disable CS8618
2+
using BenchmarkDotNet.Attributes;
3+
using Miku.Core;
4+
using System;
5+
using System.Threading.Tasks;
6+
7+
namespace Miku.Benchmark
8+
{
9+
[MemoryDiagnoser]
10+
[MeanColumn, MedianColumn, MaxColumn, MinColumn]
11+
public class MessageBenchmark
12+
{
13+
private NetServer _server;
14+
private NetClient _client;
15+
private byte[] _payload;
16+
private TaskCompletionSource<bool> _tcs;
17+
private readonly string _ip = "127.0.0.1";
18+
private readonly int _port = 55555;
19+
20+
[Params(100, 300, 500)]
21+
public int MessageSize;
22+
23+
[GlobalSetup]
24+
public void Setup()
25+
{
26+
_payload = new byte[MessageSize];
27+
new Random(42).NextBytes(_payload);
28+
29+
_server = new NetServer();
30+
_server.OnClientConnected += c => {};
31+
_server.OnClientDataReceived += (c, data) => c.Send(data.ToArray()); // Echo server
32+
_server.OnError += e => Console.WriteLine(e);
33+
_server.Start(_ip, _port);
34+
35+
_client = new NetClient();
36+
_client.OnDataReceived += (data) => _tcs?.TrySetResult(true);
37+
_client.OnError += e => Console.WriteLine(e);
38+
_client.Connect(_ip, _port);
39+
}
40+
41+
[GlobalCleanup]
42+
public void Cleanup()
43+
{
44+
_client.Stop();
45+
_server.Stop();
46+
_client.Dispose();
47+
_server.Dispose();
48+
}
49+
50+
[Benchmark]
51+
public async Task SendAndReceive()
52+
{
53+
_tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
54+
_client.Send(_payload);
55+
await _tcs.Task;
56+
}
57+
}
58+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<ItemGroup>
4+
<ProjectReference Include="..\Miku.Core\Miku.Core.csproj" />
5+
</ItemGroup>
6+
7+
<ItemGroup>
8+
<PackageReference Include="BenchmarkDotNet" Version="0.15.2" />
9+
</ItemGroup>
10+
11+
<PropertyGroup>
12+
<OutputType>Exe</OutputType>
13+
<TargetFramework>net8.0</TargetFramework>
14+
<ImplicitUsings>enable</ImplicitUsings>
15+
<Nullable>enable</Nullable>
16+
</PropertyGroup>
17+
18+
</Project>

Miku.Benchmark/Program.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using BenchmarkDotNet.Running;
2+
using Miku.Benchmark;
3+
4+
public class Program
5+
{
6+
public static void Main(string[] args)
7+
{
8+
BenchmarkRunner.Run<MessageBenchmark>();
9+
}
10+
}

Miku.Benchmark/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Miku.Benchmark
2+
3+
This project contains benchmarks for the Miku library to measure its performance.
4+
5+
## How to Run
6+
7+
To run the benchmarks, execute the following command from the root of the repository:
8+
9+
```bash
10+
dotnet run -c Release --project Miku.Benchmark/Miku.Benchmark.csproj
11+
```
12+
13+
The results will be displayed in the console and also saved in the `BenchmarkDotNet.Artifacts` directory.

Miku.sln

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,56 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Miku.Core", "Miku.Core\Miku
44
EndProject
55
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Miku.UnitTest", "Miku.UnitTest\Miku.UnitTest.csproj", "{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}"
66
EndProject
7+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Miku.Benchmark", "Miku.Benchmark\Miku.Benchmark.csproj", "{1A892EDB-A82E-4365-801B-E2621CDC6AF9}"
8+
EndProject
79
Global
810
GlobalSection(SolutionConfigurationPlatforms) = preSolution
911
Debug|Any CPU = Debug|Any CPU
12+
Debug|x64 = Debug|x64
13+
Debug|x86 = Debug|x86
1014
Release|Any CPU = Release|Any CPU
15+
Release|x64 = Release|x64
16+
Release|x86 = Release|x86
1117
EndGlobalSection
1218
GlobalSection(ProjectConfigurationPlatforms) = postSolution
1319
{3B44C849-FF4C-4896-9860-1B0D16798190}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1420
{3B44C849-FF4C-4896-9860-1B0D16798190}.Debug|Any CPU.Build.0 = Debug|Any CPU
21+
{3B44C849-FF4C-4896-9860-1B0D16798190}.Debug|x64.ActiveCfg = Debug|Any CPU
22+
{3B44C849-FF4C-4896-9860-1B0D16798190}.Debug|x64.Build.0 = Debug|Any CPU
23+
{3B44C849-FF4C-4896-9860-1B0D16798190}.Debug|x86.ActiveCfg = Debug|Any CPU
24+
{3B44C849-FF4C-4896-9860-1B0D16798190}.Debug|x86.Build.0 = Debug|Any CPU
1525
{3B44C849-FF4C-4896-9860-1B0D16798190}.Release|Any CPU.ActiveCfg = Release|Any CPU
1626
{3B44C849-FF4C-4896-9860-1B0D16798190}.Release|Any CPU.Build.0 = Release|Any CPU
27+
{3B44C849-FF4C-4896-9860-1B0D16798190}.Release|x64.ActiveCfg = Release|Any CPU
28+
{3B44C849-FF4C-4896-9860-1B0D16798190}.Release|x64.Build.0 = Release|Any CPU
29+
{3B44C849-FF4C-4896-9860-1B0D16798190}.Release|x86.ActiveCfg = Release|Any CPU
30+
{3B44C849-FF4C-4896-9860-1B0D16798190}.Release|x86.Build.0 = Release|Any CPU
1731
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1832
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
33+
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Debug|x64.ActiveCfg = Debug|Any CPU
34+
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Debug|x64.Build.0 = Debug|Any CPU
35+
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Debug|x86.ActiveCfg = Debug|Any CPU
36+
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Debug|x86.Build.0 = Debug|Any CPU
1937
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
2038
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Release|Any CPU.Build.0 = Release|Any CPU
39+
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Release|x64.ActiveCfg = Release|Any CPU
40+
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Release|x64.Build.0 = Release|Any CPU
41+
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Release|x86.ActiveCfg = Release|Any CPU
42+
{7534A4BC-58F7-4CA3-87EE-1E9277553FDF}.Release|x86.Build.0 = Release|Any CPU
43+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
44+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
45+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Debug|x64.ActiveCfg = Debug|Any CPU
46+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Debug|x64.Build.0 = Debug|Any CPU
47+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Debug|x86.ActiveCfg = Debug|Any CPU
48+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Debug|x86.Build.0 = Debug|Any CPU
49+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
50+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Release|Any CPU.Build.0 = Release|Any CPU
51+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Release|x64.ActiveCfg = Release|Any CPU
52+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Release|x64.Build.0 = Release|Any CPU
53+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Release|x86.ActiveCfg = Release|Any CPU
54+
{1A892EDB-A82E-4365-801B-E2621CDC6AF9}.Release|x86.Build.0 = Release|Any CPU
55+
EndGlobalSection
56+
GlobalSection(SolutionProperties) = preSolution
57+
HideSolutionNode = FALSE
2158
EndGlobalSection
2259
EndGlobal

0 commit comments

Comments
 (0)