From f34b2cede3c61897dd0e9248dbc6b94b26b0689e Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 20 Dec 2022 15:26:17 +0000 Subject: [PATCH 1/2] Remove microbenchmarks These benchmarks are all testing things related to what Prometheus does, so perhaps have some historical interest, but we should not retain them in the main repo. Signed-off-by: Bryan Boreham --- go.mod | 1 - go.sum | 2 - tsdb/test/conv_test.go | 58 ----------- tsdb/test/hash_test.go | 123 ---------------------- tsdb/test/labels_test.go | 214 --------------------------------------- 5 files changed, 398 deletions(-) delete mode 100644 tsdb/test/conv_test.go delete mode 100644 tsdb/test/hash_test.go delete mode 100644 tsdb/test/labels_test.go diff --git a/go.mod b/go.mod index ac94408e4..8df8696b6 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,6 @@ require ( github.com/aws/aws-sdk-go v1.44.187 github.com/cespare/xxhash/v2 v2.2.0 github.com/dennwc/varint v1.0.0 - github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245 github.com/digitalocean/godo v1.95.0 github.com/docker/docker v20.10.23+incompatible github.com/edsrzf/mmap-go v1.1.0 diff --git a/go.sum b/go.sum index 06b37a309..28342ab22 100644 --- a/go.sum +++ b/go.sum @@ -148,8 +148,6 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245 h1:9cOfvEwjQxdwKuNDTQSaMKNRvwKwgZG+U4HrjeRKHso= -github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/digitalocean/godo v1.95.0 h1:S48/byPKui7RHZc1wYEPfRvkcEvToADNb5I3guu95xg= github.com/digitalocean/godo v1.95.0/go.mod h1:NRpFznZFvhHjBoqZAaOD3khVzsJ3EibzKqFL4R60dmA= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= diff --git a/tsdb/test/conv_test.go b/tsdb/test/conv_test.go deleted file mode 100644 index 0d34b9987..000000000 --- a/tsdb/test/conv_test.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package test - -import "testing" - -func BenchmarkMapConversion(b *testing.B) { - type key string - type val string - - m := map[key]val{ - "job": "node", - "instance": "123.123.1.211:9090", - "path": "/api/v1/namespaces//deployments/", - "method": "GET", - "namespace": "system", - "status": "500", - } - - var sm map[string]string - - for i := 0; i < b.N; i++ { - sm = make(map[string]string, len(m)) - for k, v := range m { - sm[string(k)] = string(v) - } - } -} - -func BenchmarkListIter(b *testing.B) { - var list []uint32 - for i := 0; i < 1e4; i++ { - list = append(list, uint32(i)) - } - - b.ResetTimer() - - total := uint32(0) - - for j := 0; j < b.N; j++ { - sum := uint32(0) - for _, k := range list { - sum += k - } - total += sum - } -} diff --git a/tsdb/test/hash_test.go b/tsdb/test/hash_test.go deleted file mode 100644 index 1242f5db5..000000000 --- a/tsdb/test/hash_test.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package test - -import ( - "crypto/rand" - "fmt" - "hash/crc32" - "testing" - - "github.com/cespare/xxhash/v2" - sip13 "github.com/dgryski/go-sip13" -) - -type pair struct { - name, value string -} - -var testInput = []pair{ - {"job", "node"}, - {"instance", "123.123.1.211:9090"}, - {"path", "/api/v1/namespaces//deployments/"}, - {"method", "GET"}, - {"namespace", "system"}, - {"status", "500"}, -} - -func BenchmarkHash(b *testing.B) { - input := []byte{} - for _, v := range testInput { - input = append(input, v.name...) - input = append(input, '\xff') - input = append(input, v.value...) - input = append(input, '\xff') - } - - var total uint64 - - var k0 uint64 = 0x0706050403020100 - var k1 uint64 = 0x0f0e0d0c0b0a0908 - - for name, f := range map[string]func(b []byte) uint64{ - "xxhash": xxhash.Sum64, - "fnv64": fnv64a, - "sip13": func(b []byte) uint64 { return sip13.Sum64(k0, k1, b) }, - } { - b.Run(name, func(b *testing.B) { - b.SetBytes(int64(len(input))) - total = 0 - for i := 0; i < b.N; i++ { - total += f(input) - } - }) - } -} - -// hashAdd adds a string to a fnv64a hash value, returning the updated hash. -func fnv64a(b []byte) uint64 { - const ( - offset64 = 14695981039346656037 - prime64 = 1099511628211 - ) - - h := uint64(offset64) - for x := range b { - h ^= uint64(x) - h *= prime64 - } - return h -} - -func BenchmarkCRC32_diff(b *testing.B) { - data := [][]byte{} - - for i := 0; i < 1000; i++ { - b := make([]byte, 512) - rand.Read(b) - data = append(data, b) - } - - ctab := crc32.MakeTable(crc32.Castagnoli) - total := uint32(0) - - b.Run("direct", func(b *testing.B) { - b.ReportAllocs() - - for i := 0; i < b.N; i++ { - total += crc32.Checksum(data[i%1000], ctab) - } - }) - b.Run("hash-reuse", func(b *testing.B) { - b.ReportAllocs() - h := crc32.New(ctab) - - for i := 0; i < b.N; i++ { - h.Reset() - h.Write(data[i%1000]) - total += h.Sum32() - } - }) - b.Run("hash-new", func(b *testing.B) { - b.ReportAllocs() - - for i := 0; i < b.N; i++ { - h := crc32.New(ctab) - h.Write(data[i%1000]) - total += h.Sum32() - } - }) - - fmt.Println(total) -} diff --git a/tsdb/test/labels_test.go b/tsdb/test/labels_test.go deleted file mode 100644 index f1ec34f3a..000000000 --- a/tsdb/test/labels_test.go +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package test - -import ( - "bytes" - "crypto/rand" - "testing" - - "github.com/prometheus/prometheus/model/labels" -) - -func BenchmarkMapClone(b *testing.B) { - m := map[string]string{ - "job": "node", - "instance": "123.123.1.211:9090", - "path": "/api/v1/namespaces//deployments/", - "method": "GET", - "namespace": "system", - "status": "500", - "prometheus": "prometheus-core-1", - "datacenter": "eu-west-1", - "pod_name": "abcdef-99999-defee", - } - - for i := 0; i < b.N; i++ { - res := make(map[string]string, len(m)) - for k, v := range m { - res[k] = v - } - m = res - } -} - -func BenchmarkLabelsClone(b *testing.B) { - m := map[string]string{ - "job": "node", - "instance": "123.123.1.211:9090", - "path": "/api/v1/namespaces//deployments/", - "method": "GET", - "namespace": "system", - "status": "500", - "prometheus": "prometheus-core-1", - "datacenter": "eu-west-1", - "pod_name": "abcdef-99999-defee", - } - l := labels.FromMap(m) - - for i := 0; i < b.N; i++ { - l = l.Copy() - } -} - -func BenchmarkLabelMapAccess(b *testing.B) { - m := map[string]string{ - "job": "node", - "instance": "123.123.1.211:9090", - "path": "/api/v1/namespaces//deployments/", - "method": "GET", - "namespace": "system", - "status": "500", - "prometheus": "prometheus-core-1", - "datacenter": "eu-west-1", - "pod_name": "abcdef-99999-defee", - } - - var v string - - for k := range m { - b.Run(k, func(b *testing.B) { - for i := 0; i < b.N; i++ { - v = m[k] - } - }) - } - - _ = v -} - -func BenchmarkLabelSetAccess(b *testing.B) { - m := map[string]string{ - "job": "node", - "instance": "123.123.1.211:9090", - "path": "/api/v1/namespaces//deployments/", - "method": "GET", - "namespace": "system", - "status": "500", - "prometheus": "prometheus-core-1", - "datacenter": "eu-west-1", - "pod_name": "abcdef-99999-defee", - } - ls := labels.FromMap(m) - - var v string - - ls.Range(func(l labels.Label) { - b.Run(l.Name, func(b *testing.B) { - for i := 0; i < b.N; i++ { - v = ls.Get(l.Name) - } - }) - }) - - _ = v -} - -func BenchmarkStringBytesEquals(b *testing.B) { - randBytes := func(n int) ([]byte, []byte) { - buf1 := make([]byte, n) - if _, err := rand.Read(buf1); err != nil { - b.Fatal(err) - } - buf2 := make([]byte, n) - copy(buf1, buf2) - - return buf1, buf2 - } - - cases := []struct { - name string - f func() ([]byte, []byte) - }{ - { - name: "equal", - f: func() ([]byte, []byte) { - return randBytes(60) - }, - }, - { - name: "1-flip-end", - f: func() ([]byte, []byte) { - b1, b2 := randBytes(60) - b2[59] ^= b2[59] - return b1, b2 - }, - }, - { - name: "1-flip-middle", - f: func() ([]byte, []byte) { - b1, b2 := randBytes(60) - b2[29] ^= b2[29] - return b1, b2 - }, - }, - { - name: "1-flip-start", - f: func() ([]byte, []byte) { - b1, b2 := randBytes(60) - b2[0] ^= b2[0] - return b1, b2 - }, - }, - { - name: "different-length", - f: func() ([]byte, []byte) { - b1, b2 := randBytes(60) - return b1, b2[:59] - }, - }, - } - - for _, c := range cases { - b.Run(c.name+"-strings", func(b *testing.B) { - ab, bb := c.f() - as, bs := string(ab), string(bb) - b.SetBytes(int64(len(as))) - - var r bool - - for i := 0; i < b.N; i++ { - r = as == bs - } - _ = r - }) - - b.Run(c.name+"-bytes", func(b *testing.B) { - ab, bb := c.f() - b.SetBytes(int64(len(ab))) - - var r bool - - for i := 0; i < b.N; i++ { - r = bytes.Equal(ab, bb) - } - _ = r - }) - - b.Run(c.name+"-bytes-length-check", func(b *testing.B) { - ab, bb := c.f() - b.SetBytes(int64(len(ab))) - - var r bool - - for i := 0; i < b.N; i++ { - if len(ab) != len(bb) { - continue - } - r = bytes.Equal(ab, bb) - } - _ = r - }) - } -} From f03b8d0968f7a9ba403f5be6079c0c663a4784a1 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 10 Jan 2023 15:41:39 +0000 Subject: [PATCH 2/2] Add benchmark copying labels Taken from previous tsdb/test/BenchmarkLabelsClone. Signed-off-by: Bryan Boreham --- model/labels/labels_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/model/labels/labels_test.go b/model/labels/labels_test.go index 69beb2fc3..1902f2f71 100644 --- a/model/labels/labels_test.go +++ b/model/labels/labels_test.go @@ -696,6 +696,25 @@ func BenchmarkLabels_Hash(b *testing.B) { } } +func BenchmarkLabels_Copy(b *testing.B) { + m := map[string]string{ + "job": "node", + "instance": "123.123.1.211:9090", + "path": "/api/v1/namespaces//deployments/", + "method": "GET", + "namespace": "system", + "status": "500", + "prometheus": "prometheus-core-1", + "datacenter": "eu-west-1", + "pod_name": "abcdef-99999-defee", + } + l := FromMap(m) + + for i := 0; i < b.N; i++ { + l = l.Copy() + } +} + func TestMarshaling(t *testing.T) { lbls := FromStrings("aaa", "111", "bbb", "2222", "ccc", "33333") expectedJSON := "{\"aaa\":\"111\",\"bbb\":\"2222\",\"ccc\":\"33333\"}"