From 4386478dc1cb4962e37188815be7950593fa3ff7 Mon Sep 17 00:00:00 2001 From: Ziya Suzen Date: Wed, 15 May 2024 13:45:07 +0100 Subject: [PATCH] Request reply baseline benchmark (#453) * Request reply benchmarks * wip * wip * Revert experimental code * Revert experimental code * Revert MicroBenchmark project * Simplified req-rep benchmark * Check return value --- sandbox/MicroBenchmark/RequestReplyBench.cs | 48 +++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 sandbox/MicroBenchmark/RequestReplyBench.cs diff --git a/sandbox/MicroBenchmark/RequestReplyBench.cs b/sandbox/MicroBenchmark/RequestReplyBench.cs new file mode 100644 index 00000000..e8710c5a --- /dev/null +++ b/sandbox/MicroBenchmark/RequestReplyBench.cs @@ -0,0 +1,48 @@ +using BenchmarkDotNet.Attributes; +using NATS.Client.Core; + +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + +namespace MicroBenchmark; + +[MemoryDiagnoser] +[ShortRunJob] +[PlainExporter] +public class RequestReplyBench +{ + private NatsConnection _nats; + private CancellationTokenSource _cts; + private Task _subscription; + + [GlobalSetup] + public async Task SetupAsync() + { + _nats = new NatsConnection(); + await _nats.ConnectAsync(); + _cts = new CancellationTokenSource(); + _subscription = Task.Run(async () => + { + await foreach (var msg in _nats.SubscribeAsync("req_rep_bench", cancellationToken: _cts.Token)) + { + await msg.ReplyAsync(0xBEEF); + } + }); + } + + [GlobalCleanup] + public async Task CleanupAsync() + { + await _cts.CancelAsync(); + await _subscription; + await _nats.DisposeAsync(); + } + + [Benchmark] + public async Task RequestReplyAsync() + { + var reply = await _nats.RequestAsync("req_rep_bench", 0xDEAD); + var result = reply.Data; + ArgumentOutOfRangeException.ThrowIfNotEqual(0xBEEF, result); + return result; + } +}