mirror of
https://github.com/FabInfra/capnproto-dotnetcore_Runtime.git
synced 2025-03-12 23:01:44 +01:00
added benchmarking suite
This commit is contained in:
parent
bb1a8bf51c
commit
3a429462e6
24
Benchmarking/Benchmark/Benchmark.csproj
Normal file
24
Benchmarking/Benchmark/Benchmark.csproj
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="BenchmarkDotNet" Version="0.12.0" />
|
||||||
|
<PackageReference Include="Capnp.Net.Runtime" Version="1.2.189" />
|
||||||
|
<PackageReference Include="CapnpC.CSharp.MsBuild.Generation" Version="1.2.138" />
|
||||||
|
<PackageReference Include="Google.Protobuf" Version="3.11.3" />
|
||||||
|
<PackageReference Include="Grpc.Net.Client" Version="2.27.0" />
|
||||||
|
<PackageReference Include="Grpc.Tools" Version="2.27.0">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Protobuf Include="Protos\Echo.proto" GrpcServices="Client" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
46
Benchmarking/Benchmark/CapnpBenchmark.cs
Normal file
46
Benchmarking/Benchmark/CapnpBenchmark.cs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using BenchmarkDotNet.Jobs;
|
||||||
|
using Capnp.Rpc;
|
||||||
|
using CapnpGen;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Benchmark
|
||||||
|
{
|
||||||
|
public class CapnpBenchmark
|
||||||
|
{
|
||||||
|
[Params(20, 200, 2000, 20000, 200000, 2000000)]
|
||||||
|
public int PayloadBytes;
|
||||||
|
|
||||||
|
TcpRpcClient _client;
|
||||||
|
IEchoer _echoer;
|
||||||
|
byte[] _payload;
|
||||||
|
|
||||||
|
[GlobalSetup]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
_client = new TcpRpcClient("localhost", 5002);
|
||||||
|
_client.WhenConnected.Wait();
|
||||||
|
_echoer = _client.GetMain<IEchoer>();
|
||||||
|
_payload = new byte[PayloadBytes];
|
||||||
|
new Random().NextBytes(_payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
[GlobalCleanup]
|
||||||
|
public void Cleanup()
|
||||||
|
{
|
||||||
|
_echoer.Dispose();
|
||||||
|
_client.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public void Echo()
|
||||||
|
{
|
||||||
|
var t = _echoer.Echo(_payload);
|
||||||
|
t.Wait();
|
||||||
|
if (t.Result?.Count != _payload.Length)
|
||||||
|
throw new InvalidOperationException("Echo server malfunction");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
42
Benchmarking/Benchmark/GrpcBenchmark.cs
Normal file
42
Benchmarking/Benchmark/GrpcBenchmark.cs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using BenchmarkDotNet.Jobs;
|
||||||
|
using Grpc.Net.Client;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Benchmark
|
||||||
|
{
|
||||||
|
public class GrpcBenchmark
|
||||||
|
{
|
||||||
|
[Params(20, 200, 2000, 20000, 200000, 2000000)]
|
||||||
|
public int PayloadBytes;
|
||||||
|
|
||||||
|
GrpcChannel _channel;
|
||||||
|
Echoer.EchoerClient _echoer;
|
||||||
|
byte[] _payload;
|
||||||
|
|
||||||
|
[GlobalSetup]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
_channel = GrpcChannel.ForAddress("https://localhost:5001");
|
||||||
|
_echoer = new Echoer.EchoerClient(_channel);
|
||||||
|
_payload = new byte[PayloadBytes];
|
||||||
|
new Random().NextBytes(_payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
[GlobalCleanup]
|
||||||
|
public void Teardown()
|
||||||
|
{
|
||||||
|
_channel.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public void Echo()
|
||||||
|
{
|
||||||
|
var reply = _echoer.Echo(new EchoRequest { Payload = Google.Protobuf.ByteString.CopyFrom(_payload) });
|
||||||
|
if (reply?.Payload?.Length != _payload.Length)
|
||||||
|
throw new InvalidOperationException("Echo server malfunction");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
Benchmarking/Benchmark/Program.cs
Normal file
18
Benchmarking/Benchmark/Program.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using BenchmarkDotNet.Running;
|
||||||
|
using Capnp.Rpc;
|
||||||
|
using Grpc.Net.Client;
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Benchmark
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
BenchmarkRunner.Run<GrpcBenchmark>();
|
||||||
|
BenchmarkRunner.Run<CapnpBenchmark>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
Benchmarking/Benchmark/Protos/Echo.capnp
Normal file
5
Benchmarking/Benchmark/Protos/Echo.capnp
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
@0x8c309c720de8cf7c;
|
||||||
|
|
||||||
|
interface Echoer {
|
||||||
|
echo @0 (input : Data) -> (output : Data);
|
||||||
|
}
|
13
Benchmarking/Benchmark/Protos/Echo.proto
Normal file
13
Benchmarking/Benchmark/Protos/Echo.proto
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
service Echoer {
|
||||||
|
rpc Echo (EchoRequest) returns (EchoReply);
|
||||||
|
}
|
||||||
|
|
||||||
|
message EchoRequest {
|
||||||
|
bytes payload = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message EchoReply {
|
||||||
|
bytes payload = 1;
|
||||||
|
}
|
37
Benchmarking/CapnpBench.sln
Normal file
37
Benchmarking/CapnpBench.sln
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 16
|
||||||
|
VisualStudioVersion = 16.0.29728.190
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EchoServiceGrpc", "EchoServiceGrpc\EchoServiceGrpc.csproj", "{D59C7B71-3887-426B-A636-2DBDA0549817}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmark", "Benchmark\Benchmark.csproj", "{7F7580CA-CCF0-4650-87BF-502D51A8F435}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EchoServiceCapnp", "EchoServiceCapnp\EchoServiceCapnp.csproj", "{309A4A26-F29E-4F49-AB49-76BAE0FD7D62}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{D59C7B71-3887-426B-A636-2DBDA0549817}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{D59C7B71-3887-426B-A636-2DBDA0549817}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{D59C7B71-3887-426B-A636-2DBDA0549817}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{D59C7B71-3887-426B-A636-2DBDA0549817}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{7F7580CA-CCF0-4650-87BF-502D51A8F435}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{7F7580CA-CCF0-4650-87BF-502D51A8F435}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{7F7580CA-CCF0-4650-87BF-502D51A8F435}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{7F7580CA-CCF0-4650-87BF-502D51A8F435}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{309A4A26-F29E-4F49-AB49-76BAE0FD7D62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{309A4A26-F29E-4F49-AB49-76BAE0FD7D62}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{309A4A26-F29E-4F49-AB49-76BAE0FD7D62}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{309A4A26-F29E-4F49-AB49-76BAE0FD7D62}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {A6702BC8-8CC0-4BDA-8BD5-D5D268291E93}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
13
Benchmarking/EchoServiceCapnp/EchoServiceCapnp.csproj
Normal file
13
Benchmarking/EchoServiceCapnp/EchoServiceCapnp.csproj
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Capnp.Net.Runtime" Version="1.2.189" />
|
||||||
|
<PackageReference Include="CapnpC.CSharp.MsBuild.Generation" Version="1.2.138" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
20
Benchmarking/EchoServiceCapnp/Program.cs
Normal file
20
Benchmarking/EchoServiceCapnp/Program.cs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
using Capnp.Rpc;
|
||||||
|
using EchoServiceCapnp.Services;
|
||||||
|
using System;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
|
namespace EchoServiceCapnp
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
using (var server = new TcpRpcServer(IPAddress.Any, 5002))
|
||||||
|
{
|
||||||
|
server.Main = new CapnpEchoService();
|
||||||
|
Console.WriteLine("Press RETURN to stop listening");
|
||||||
|
Console.ReadLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
Benchmarking/EchoServiceCapnp/Protos/Echo.capnp
Normal file
5
Benchmarking/EchoServiceCapnp/Protos/Echo.capnp
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
@0x8c309c720de8cf7c;
|
||||||
|
|
||||||
|
interface Echoer {
|
||||||
|
echo @0 (input : Data) -> (output : Data);
|
||||||
|
}
|
20
Benchmarking/EchoServiceCapnp/Services/CapnpEchoService.cs
Normal file
20
Benchmarking/EchoServiceCapnp/Services/CapnpEchoService.cs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace EchoServiceCapnp.Services
|
||||||
|
{
|
||||||
|
public class CapnpEchoService : CapnpGen.IEchoer
|
||||||
|
{
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<IReadOnlyList<byte>> Echo(IReadOnlyList<byte> input, CancellationToken cancellationToken_ = default)
|
||||||
|
{
|
||||||
|
return Task.FromResult(input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
Benchmarking/EchoServiceGrpc/EchoServiceGrpc.csproj
Normal file
15
Benchmarking/EchoServiceGrpc/EchoServiceGrpc.csproj
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Protobuf Include="Protos\Echo.proto" GrpcServices="Server" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Grpc.AspNetCore" Version="2.24.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
27
Benchmarking/EchoServiceGrpc/Program.cs
Normal file
27
Benchmarking/EchoServiceGrpc/Program.cs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
|
||||||
|
namespace EchoService
|
||||||
|
{
|
||||||
|
public class Program
|
||||||
|
{
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
CreateHostBuilder(args).Build().Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Additional configuration is required to successfully run gRPC on macOS.
|
||||||
|
// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
|
||||||
|
public static IHostBuilder CreateHostBuilder(string[] args) =>
|
||||||
|
Host.CreateDefaultBuilder(args)
|
||||||
|
.ConfigureWebHostDefaults(webBuilder =>
|
||||||
|
{
|
||||||
|
webBuilder.UseStartup<Startup>();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
13
Benchmarking/EchoServiceGrpc/Protos/Echo.proto
Normal file
13
Benchmarking/EchoServiceGrpc/Protos/Echo.proto
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
service Echoer {
|
||||||
|
rpc Echo (EchoRequest) returns (EchoReply);
|
||||||
|
}
|
||||||
|
|
||||||
|
message EchoRequest {
|
||||||
|
bytes payload = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message EchoReply {
|
||||||
|
bytes payload = 1;
|
||||||
|
}
|
26
Benchmarking/EchoServiceGrpc/Services/GrpcEchoService.cs
Normal file
26
Benchmarking/EchoServiceGrpc/Services/GrpcEchoService.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Grpc.Core;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace EchoService
|
||||||
|
{
|
||||||
|
public class GrpcEchoService : Echoer.EchoerBase
|
||||||
|
{
|
||||||
|
private readonly ILogger<GrpcEchoService> _logger;
|
||||||
|
public GrpcEchoService(ILogger<GrpcEchoService> logger)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task<EchoReply> Echo(EchoRequest request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
return Task.FromResult(new EchoReply
|
||||||
|
{
|
||||||
|
Payload = request.Payload
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
43
Benchmarking/EchoServiceGrpc/Startup.cs
Normal file
43
Benchmarking/EchoServiceGrpc/Startup.cs
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
|
||||||
|
namespace EchoService
|
||||||
|
{
|
||||||
|
public class Startup
|
||||||
|
{
|
||||||
|
// This method gets called by the runtime. Use this method to add services to the container.
|
||||||
|
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
|
||||||
|
public void ConfigureServices(IServiceCollection services)
|
||||||
|
{
|
||||||
|
services.AddGrpc();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||||
|
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||||
|
{
|
||||||
|
if (env.IsDevelopment())
|
||||||
|
{
|
||||||
|
app.UseDeveloperExceptionPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
app.UseRouting();
|
||||||
|
|
||||||
|
app.UseEndpoints(endpoints =>
|
||||||
|
{
|
||||||
|
endpoints.MapGrpcService<GrpcEchoService>();
|
||||||
|
|
||||||
|
endpoints.MapGet("/", async context =>
|
||||||
|
{
|
||||||
|
await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
10
Benchmarking/EchoServiceGrpc/appsettings.Development.json
Normal file
10
Benchmarking/EchoServiceGrpc/appsettings.Development.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Warning",
|
||||||
|
"System": "Warning",
|
||||||
|
"Grpc": "Warning",
|
||||||
|
"Microsoft": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
Benchmarking/EchoServiceGrpc/appsettings.json
Normal file
15
Benchmarking/EchoServiceGrpc/appsettings.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Warning",
|
||||||
|
"Microsoft": "Warning",
|
||||||
|
"Microsoft.Hosting.Lifetime": "Warning"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"AllowedHosts": "*",
|
||||||
|
"Kestrel": {
|
||||||
|
"EndpointDefaults": {
|
||||||
|
"Protocols": "Http2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user