Skip to content

Instantly share code, notes, and snippets.

@guitarrapc
Last active March 16, 2021 15:09
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save guitarrapc/9b893628c45edbc53fde664ec4eda250 to your computer and use it in GitHub Desktop.
Calculate Histogram for TimeSpans
void Main()
{
var random = new Random();
var data = Enumerable.Range(0, 10000)
.Select(x => TimeSpan.FromMilliseconds(random.Next(1, 500)))
.OrderBy(x => x)
.ToArray();
var fastest = data[0];
var slowest = data[^1];
Histogram(data, slowest.TotalMilliseconds, fastest.TotalMilliseconds).Dump();
}
public HistogramBucket[] Histogram(TimeSpan[] latencies, double slowest, double fastest)
{
var bc = 10;
var buckets = new double[bc + 1];
var counts = new int[bc + 1];
var bs = (slowest - fastest) / bc;
for (var i = 0; i < bc; i++)
{
buckets[i] = fastest + bs * i;
}
buckets[bc] = slowest;
int bi = 0;
int max = 0;
for (var i = 0; i < latencies.Length;)
{
if (latencies[i].TotalMilliseconds <= buckets[bi])
{
i++;
counts[bi]++;
if (max < counts[bi])
{
max = counts[bi];
}
}
else if (bi < buckets.Length - 1)
{
bi++;
}
}
var res = new HistogramBucket[buckets.Length];
for (var i = 0; i < buckets.Length; i++)
{
res[i] = new HistogramBucket
{
Mark = buckets[i],
Count = counts[i],
Frequency = (double)counts[i] / (double)latencies.Length,
};
}
return res;
}
public struct LatencyDistribution
{
public int Percentile { get; set; }
public TimeSpan Latency { get; set; }
}
public struct HistogramBucket
{
public double Mark { get; set; }
public int Count { get; set; }
public double Frequency { get; set; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment