mirror of
https://github.com/prometheus/prometheus.git
synced 2025-01-13 06:47:28 -08:00
Labels benchmarks: remove artefact of small symbol-tables
Symbol tables with fewer than 128 entries, so everything can be represented as a single byte, are not realistic. Stuff the symbol table with fake entries before adding the real ones. Signed-off-by: Bryan Boreham <bjboreham@gmail.com>
This commit is contained in:
parent
2ba7bc9446
commit
7a82e4b503
|
@ -466,6 +466,38 @@ func TestLabels_DropMetricName(t *testing.T) {
|
||||||
require.True(t, Equal(original, check))
|
require.True(t, Equal(original, check))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ScratchBuilderForBenchmark() ScratchBuilder {
|
||||||
|
// (Only relevant to -tags dedupelabels: stuff the symbol table before adding the real labels, to avoid having everything fitting into 1 byte.)
|
||||||
|
b := NewScratchBuilder(256)
|
||||||
|
for i := 0; i < 256; i++ {
|
||||||
|
b.Add(fmt.Sprintf("name%d", i), fmt.Sprintf("value%d", i))
|
||||||
|
}
|
||||||
|
b.Labels()
|
||||||
|
b.Reset()
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewForBenchmark(ls ...Label) Labels {
|
||||||
|
b := ScratchBuilderForBenchmark()
|
||||||
|
for _, l := range ls {
|
||||||
|
b.Add(l.Name, l.Value)
|
||||||
|
}
|
||||||
|
b.Sort()
|
||||||
|
return b.Labels()
|
||||||
|
}
|
||||||
|
|
||||||
|
func FromStringsForBenchmark(ss ...string) Labels {
|
||||||
|
if len(ss)%2 != 0 {
|
||||||
|
panic("invalid number of strings")
|
||||||
|
}
|
||||||
|
b := ScratchBuilderForBenchmark()
|
||||||
|
for i := 0; i < len(ss); i += 2 {
|
||||||
|
b.Add(ss[i], ss[i+1])
|
||||||
|
}
|
||||||
|
b.Sort()
|
||||||
|
return b.Labels()
|
||||||
|
}
|
||||||
|
|
||||||
// BenchmarkLabels_Get was written to check whether a binary search can improve the performance vs the linear search implementation
|
// BenchmarkLabels_Get was written to check whether a binary search can improve the performance vs the linear search implementation
|
||||||
// The results have shown that binary search would only be better when searching last labels in scenarios with more than 10 labels.
|
// The results have shown that binary search would only be better when searching last labels in scenarios with more than 10 labels.
|
||||||
// In the following list, `old` is the linear search while `new` is the binary search implementation (without calling sort.Search, which performs even worse here)
|
// In the following list, `old` is the linear search while `new` is the binary search implementation (without calling sort.Search, which performs even worse here)
|
||||||
|
@ -488,7 +520,7 @@ func BenchmarkLabels_Get(b *testing.B) {
|
||||||
}
|
}
|
||||||
for _, size := range []int{5, 10, maxLabels} {
|
for _, size := range []int{5, 10, maxLabels} {
|
||||||
b.Run(fmt.Sprintf("with %d labels", size), func(b *testing.B) {
|
b.Run(fmt.Sprintf("with %d labels", size), func(b *testing.B) {
|
||||||
labels := New(allLabels[:size]...)
|
labels := NewForBenchmark(allLabels[:size]...)
|
||||||
for _, scenario := range []struct {
|
for _, scenario := range []struct {
|
||||||
desc, label string
|
desc, label string
|
||||||
}{
|
}{
|
||||||
|
@ -520,33 +552,33 @@ var comparisonBenchmarkScenarios = []struct {
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
"equal",
|
"equal",
|
||||||
FromStrings("a_label_name", "a_label_value", "another_label_name", "another_label_value"),
|
FromStringsForBenchmark("a_label_name", "a_label_value", "another_label_name", "another_label_value"),
|
||||||
FromStrings("a_label_name", "a_label_value", "another_label_name", "another_label_value"),
|
FromStringsForBenchmark("a_label_name", "a_label_value", "another_label_name", "another_label_value"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"not equal",
|
"not equal",
|
||||||
FromStrings("a_label_name", "a_label_value", "another_label_name", "another_label_value"),
|
FromStringsForBenchmark("a_label_name", "a_label_value", "another_label_name", "another_label_value"),
|
||||||
FromStrings("a_label_name", "a_label_value", "another_label_name", "a_different_label_value"),
|
FromStringsForBenchmark("a_label_name", "a_label_value", "another_label_name", "a_different_label_value"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"different sizes",
|
"different sizes",
|
||||||
FromStrings("a_label_name", "a_label_value", "another_label_name", "another_label_value"),
|
FromStringsForBenchmark("a_label_name", "a_label_value", "another_label_name", "another_label_value"),
|
||||||
FromStrings("a_label_name", "a_label_value"),
|
FromStringsForBenchmark("a_label_name", "a_label_value"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"lots",
|
"lots",
|
||||||
FromStrings("aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg", "hhh", "iii", "jjj", "kkk", "lll", "mmm", "nnn", "ooo", "ppp", "qqq", "rrz"),
|
FromStringsForBenchmark("aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg", "hhh", "iii", "jjj", "kkk", "lll", "mmm", "nnn", "ooo", "ppp", "qqq", "rrz"),
|
||||||
FromStrings("aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg", "hhh", "iii", "jjj", "kkk", "lll", "mmm", "nnn", "ooo", "ppp", "qqq", "rrr"),
|
FromStringsForBenchmark("aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg", "hhh", "iii", "jjj", "kkk", "lll", "mmm", "nnn", "ooo", "ppp", "qqq", "rrr"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"real long equal",
|
"real long equal",
|
||||||
FromStrings("__name__", "kube_pod_container_status_last_terminated_exitcode", "cluster", "prod-af-north-0", " container", "prometheus", "instance", "kube-state-metrics-0:kube-state-metrics:ksm", "job", "kube-state-metrics/kube-state-metrics", " namespace", "observability-prometheus", "pod", "observability-prometheus-0", "uid", "d3ec90b2-4975-4607-b45d-b9ad64bb417e"),
|
FromStringsForBenchmark("__name__", "kube_pod_container_status_last_terminated_exitcode", "cluster", "prod-af-north-0", " container", "prometheus", "instance", "kube-state-metrics-0:kube-state-metrics:ksm", "job", "kube-state-metrics/kube-state-metrics", " namespace", "observability-prometheus", "pod", "observability-prometheus-0", "uid", "d3ec90b2-4975-4607-b45d-b9ad64bb417e"),
|
||||||
FromStrings("__name__", "kube_pod_container_status_last_terminated_exitcode", "cluster", "prod-af-north-0", " container", "prometheus", "instance", "kube-state-metrics-0:kube-state-metrics:ksm", "job", "kube-state-metrics/kube-state-metrics", " namespace", "observability-prometheus", "pod", "observability-prometheus-0", "uid", "d3ec90b2-4975-4607-b45d-b9ad64bb417e"),
|
FromStringsForBenchmark("__name__", "kube_pod_container_status_last_terminated_exitcode", "cluster", "prod-af-north-0", " container", "prometheus", "instance", "kube-state-metrics-0:kube-state-metrics:ksm", "job", "kube-state-metrics/kube-state-metrics", " namespace", "observability-prometheus", "pod", "observability-prometheus-0", "uid", "d3ec90b2-4975-4607-b45d-b9ad64bb417e"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"real long different end",
|
"real long different end",
|
||||||
FromStrings("__name__", "kube_pod_container_status_last_terminated_exitcode", "cluster", "prod-af-north-0", " container", "prometheus", "instance", "kube-state-metrics-0:kube-state-metrics:ksm", "job", "kube-state-metrics/kube-state-metrics", " namespace", "observability-prometheus", "pod", "observability-prometheus-0", "uid", "d3ec90b2-4975-4607-b45d-b9ad64bb417e"),
|
FromStringsForBenchmark("__name__", "kube_pod_container_status_last_terminated_exitcode", "cluster", "prod-af-north-0", " container", "prometheus", "instance", "kube-state-metrics-0:kube-state-metrics:ksm", "job", "kube-state-metrics/kube-state-metrics", " namespace", "observability-prometheus", "pod", "observability-prometheus-0", "uid", "d3ec90b2-4975-4607-b45d-b9ad64bb417e"),
|
||||||
FromStrings("__name__", "kube_pod_container_status_last_terminated_exitcode", "cluster", "prod-af-north-0", " container", "prometheus", "instance", "kube-state-metrics-0:kube-state-metrics:ksm", "job", "kube-state-metrics/kube-state-metrics", " namespace", "observability-prometheus", "pod", "observability-prometheus-0", "uid", "deadbeef-0000-1111-2222-b9ad64bb417e"),
|
FromStringsForBenchmark("__name__", "kube_pod_container_status_last_terminated_exitcode", "cluster", "prod-af-north-0", " container", "prometheus", "instance", "kube-state-metrics-0:kube-state-metrics:ksm", "job", "kube-state-metrics/kube-state-metrics", " namespace", "observability-prometheus", "pod", "observability-prometheus-0", "uid", "deadbeef-0000-1111-2222-b9ad64bb417e"),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -834,7 +866,7 @@ func BenchmarkBuilder(b *testing.B) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkLabels_Copy(b *testing.B) {
|
func BenchmarkLabels_Copy(b *testing.B) {
|
||||||
l := New(benchmarkLabels...)
|
l := NewForBenchmark(benchmarkLabels...)
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
l = l.Copy()
|
l = l.Copy()
|
||||||
|
|
Loading…
Reference in a new issue