feat: add benchmark test project for Go vs .NET server comparison
Side-by-side performance benchmarks using NATS.Client.Core against both servers on ephemeral ports. Includes core pub/sub, request/reply latency, and JetStream throughput tests with comparison output and benchmarks_comparison.md results. Also fixes timestamp flakiness in StoreInterfaceTests by using explicit timestamps.
This commit is contained in:
51
tests/NATS.Server.Benchmark.Tests/Harness/LatencyTracker.cs
Normal file
51
tests/NATS.Server.Benchmark.Tests/Harness/LatencyTracker.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace NATS.Server.Benchmark.Tests.Harness;
|
||||
|
||||
/// <summary>
|
||||
/// Pre-allocated latency recording buffer with percentile computation.
|
||||
/// Records elapsed ticks from Stopwatch for each sample.
|
||||
/// </summary>
|
||||
public sealed class LatencyTracker
|
||||
{
|
||||
private readonly long[] _samples;
|
||||
private int _count;
|
||||
private bool _sorted;
|
||||
|
||||
public LatencyTracker(int capacity)
|
||||
{
|
||||
_samples = new long[capacity];
|
||||
}
|
||||
|
||||
public void Record(long elapsedTicks)
|
||||
{
|
||||
if (_count < _samples.Length)
|
||||
{
|
||||
_samples[_count++] = elapsedTicks;
|
||||
_sorted = false;
|
||||
}
|
||||
}
|
||||
|
||||
public LatencyPercentiles ComputePercentiles()
|
||||
{
|
||||
if (_count == 0)
|
||||
return new LatencyPercentiles(0, 0, 0, 0, 0);
|
||||
|
||||
if (!_sorted)
|
||||
{
|
||||
Array.Sort(_samples, 0, _count);
|
||||
_sorted = true;
|
||||
}
|
||||
|
||||
var ticksPerUs = Stopwatch.Frequency / 1_000_000.0;
|
||||
|
||||
return new LatencyPercentiles(
|
||||
P50Us: _samples[Percentile(50)] / ticksPerUs,
|
||||
P95Us: _samples[Percentile(95)] / ticksPerUs,
|
||||
P99Us: _samples[Percentile(99)] / ticksPerUs,
|
||||
MinUs: _samples[0] / ticksPerUs,
|
||||
MaxUs: _samples[_count - 1] / ticksPerUs);
|
||||
}
|
||||
|
||||
private int Percentile(int p) => Math.Min((int)(_count * (p / 100.0)), _count - 1);
|
||||
}
|
||||
Reference in New Issue
Block a user