master
go 89 lines 2.27 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package metrix
4
5 import (
6 "strconv"
7 "testing"
8 )
9
10 // Baseline results (2026-02-13, darwin/arm64, Apple M4 Pro):
11 // Command:
12 //
13 // go test ./pkg/metrix -run '^$' -bench 'VecVsWithLabelsSnapshotGauge' -benchmem
14 //
15 // BenchmarkVecVsWithLabelsSnapshotGauge/with_labels_10_series-14 188834 6332 ns/op 13456 B/op 215 allocs/op
16 // BenchmarkVecVsWithLabelsSnapshotGauge/vec_10_series-14 273654 4356 ns/op 8976 B/op 135 allocs/op
17 // BenchmarkVecVsWithLabelsSnapshotGauge/with_labels_100_series-14 18757 63167 ns/op 125457 B/op 1934 allocs/op
18 // BenchmarkVecVsWithLabelsSnapshotGauge/vec_100_series-14 27187 44716 ns/op 80658 B/op 1134 allocs/op
19 //
20 // Keep this block updated when changing vec or label-merging write paths.
21 func BenchmarkVecVsWithLabelsSnapshotGauge(b *testing.B) {
22 tests := map[string]struct {
23 seriesCount int
24 useVec bool
25 }{
26 "with_labels_10_series": {
27 seriesCount: 10,
28 useVec: false,
29 },
30 "vec_10_series": {
31 seriesCount: 10,
32 useVec: true,
33 },
34 "with_labels_100_series": {
35 seriesCount: 100,
36 useVec: false,
37 },
38 "vec_100_series": {
39 seriesCount: 100,
40 useVec: true,
41 },
42 }
43
44 for name, tc := range tests {
45 b.Run(name, func(b *testing.B) {
46 s := NewCollectorStore()
47 cc := benchmarkCycleController(b, s)
48 states := benchmarkVecStates(tc.seriesCount)
49 if tc.useVec {
50 vec := s.Write().SnapshotMeter("bench.vec").Vec("instance", "state").Gauge("workers")
51 b.ReportAllocs()
52 b.ResetTimer()
53 for i := 0; i < b.N; i++ {
54 cc.BeginCycle()
55 for _, state := range states {
56 vec.WithLabelValues("job-a", state).Observe(SampleValue(i))
57 }
58 cc.CommitCycleSuccess()
59 }
60 return
61 }
62
63 sm := s.Write().SnapshotMeter("bench.vec")
64 b.ReportAllocs()
65 b.ResetTimer()
66 for i := 0; i < b.N; i++ {
67 cc.BeginCycle()
68 for _, state := range states {
69 sm.WithLabels(
70 Label{Key: "instance", Value: "job-a"},
71 Label{Key: "state", Value: state},
72 ).Gauge("workers").Observe(SampleValue(i))
73 }
74 cc.CommitCycleSuccess()
75 }
76 })
77 }
78 }
79
80 func benchmarkVecStates(n int) []string {
81 if n < 1 {
82 n = 1
83 }
84 out := make([]string, n)
85 for i := 0; i < n; i++ {
86 out[i] = "s" + strconv.Itoa(i)
87 }
88 return out
89 }