File size: 1,391 Bytes
f8d016c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
export function percentile(values: number[], q: number): number {
  const a = [...values].sort((x, y) => x - y);
  const i = (a.length - 1) * q;
  const i0 = Math.floor(i), i1 = Math.ceil(i);
  return i0 === i1 ? a[i0] : a[i0] + (a[i1] - a[i0]) * (i - i0);
}

export interface BenchmarkRawResult {
  load_ms: number;
  first_infer_ms: number;
  subsequent_infer_ms: number[];
}

export interface BenchmarkMetrics {
  load_ms: { p50: number; p90: number; raw: number[] };
  first_infer_ms: { p50: number; p90: number; raw: number[] };
  subsequent_infer_ms: { p50: number; p90: number; raw: number[] };
}

export function aggregateMetrics(results: BenchmarkRawResult[]): BenchmarkMetrics {
  const loads: number[] = [];
  const firsts: number[] = [];
  const subsequents: number[] = [];

  for (const r of results) {
    loads.push(r.load_ms);
    firsts.push(r.first_infer_ms);
    subsequents.push(...r.subsequent_infer_ms);
  }

  return {
    load_ms: {
      p50: +percentile(loads, 0.5).toFixed(1),
      p90: +percentile(loads, 0.9).toFixed(1),
      raw: loads,
    },
    first_infer_ms: {
      p50: +percentile(firsts, 0.5).toFixed(1),
      p90: +percentile(firsts, 0.9).toFixed(1),
      raw: firsts,
    },
    subsequent_infer_ms: {
      p50: +percentile(subsequents, 0.5).toFixed(1),
      p90: +percentile(subsequents, 0.9).toFixed(1),
      raw: subsequents,
    },
  };
}