Files
natsdotnet/tests/NATS.Server.Benchmark.Tests/Harness/LatencyTracker.cs
Joseph Doherty 37575dc41c 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.
2026-03-13 01:23:31 -04:00

52 lines
1.3 KiB
C#

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);
}