Problems › TypeScript › monitoring
The p95 of a batch of latencies
Dashboards quote p95 rather than the average, so one pathological request does not hide behind a thousand fast ones.
- Use the nearest-rank method: sort ascending, then take the value at position ceil(rank percent of the count), counting from 1.
- The rank is a percentage from 1 to 100; anything outside that gives 0.
- No readings gives 0.
percentileValue(values: list<int>, rank: int) → int
Where you start
function percentileValue(values: number[], rank: number): number {
}
Worked examples
| Call | Result |
|---|---|
percentileValue([1,2,3,4,5], 50) | 3 |
percentileValue([1,2,3,4,5], 100) | 5 |
percentileValue([1,2,3,4,5], 1) | 1 |
percentileValue([10,20,30,40,50,60,70,80,90,100], 95) | 100 |
Hint
In integers, ceil(rank * n / 100) is (rank * n + 99) / 100. Then subtract one for a zero-based index.
Reference solution in TypeScript
function percentileValue(values: number[], rank: number): number {
if (values.length === 0 || rank < 1 || rank > 100) return 0;
const s = values.slice().sort((a, b) => a - b);
const pos = Math.floor((rank * s.length + 99) / 100);
return s[pos - 1];
}