-
Notifications
You must be signed in to change notification settings - Fork 0
/
ScenarioMetrics.cs
114 lines (97 loc) · 3.29 KB
/
ScenarioMetrics.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System;
using System.Collections.Generic;
using MathNet.Numerics.Statistics;
namespace VectorIndexScenarioSuite
{
internal class PercentileStats
{
public double Min { get; set; }
public double P50 { get; set; }
public double P95 { get; set; }
public double P99 { get; set; }
public double Max { get; set; }
public double Avg { get; set; }
public override string ToString()
{
return $"Min: {Min}, P50: {P50}, P95: {P95}, P99: {P99}, Max: {Max}, Avg: {Avg}";
}
}
internal class ScenarioMetrics
{
private List<double> requestUnits;
private List<double> clientLatenciesInMs;
private List<double> serverLatenciesInMs;
private object lockObject = new object();
public ScenarioMetrics(int totalNumberOfRequests)
{
this.requestUnits = new List<double>(totalNumberOfRequests);
this.clientLatenciesInMs = new List<double>(totalNumberOfRequests);
this.serverLatenciesInMs = new List<double>(totalNumberOfRequests);
}
public void AddClientLatencyMeasurement(double latency)
{
lock (lockObject)
{
this.clientLatenciesInMs.Add(latency);
}
}
public void AddServerLatencyMeasurement(double latency)
{
lock (lockObject)
{
this.serverLatenciesInMs.Add(latency);
}
}
public void AddRequestUnitMeasurement(double requestUnit)
{
lock (lockObject)
{
this.requestUnits.Add(requestUnit);
}
}
public PercentileStats GetClientLatencyStatistics()
{
lock (lockObject)
{
return CalculatePercentiles(this.clientLatenciesInMs);
}
}
public PercentileStats GetServerLatencyStatistics()
{
lock (lockObject)
{
return CalculatePercentiles(this.serverLatenciesInMs);
}
}
public PercentileStats GetRequestUnitStatistics()
{
lock (lockObject)
{
return CalculatePercentiles(this.requestUnits);
}
}
private PercentileStats CalculatePercentiles(List<double> measurements)
{
if (measurements == null || measurements.Count == 0)
{
return new PercentileStats();
}
var descriptiveStatistics = new DescriptiveStatistics(measurements);
double min = descriptiveStatistics.Minimum;
double max = descriptiveStatistics.Maximum;
double p50 = Statistics.Percentile(measurements, 50);
double p95 = Statistics.Percentile(measurements, 95);
double p99 = Statistics.Percentile(measurements, 99);
double avg = descriptiveStatistics.Mean;
return new PercentileStats()
{
Min = min,
P50 = p50,
P95 = p95,
P99 = p99,
Max = max,
Avg = avg
};
}
}
}