mirror of
https://github.com/prometheus/prometheus
synced 2025-01-08 23:49:56 +00:00
b08f82fa4e
This adds interval metadata to indexed chunks. The queried interval is used to filter chunks when queried from the index to save unnecessary accesses of the chunks file. This is especially relevant for series that come and go often and larger files.
155 lines
2.5 KiB
Go
155 lines
2.5 KiB
Go
package test
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/rand"
|
|
"testing"
|
|
|
|
"github.com/fabxc/tsdb"
|
|
)
|
|
|
|
func BenchmarkLabelMapAccess(b *testing.B) {
|
|
m := map[string]string{
|
|
"job": "node",
|
|
"instance": "123.123.1.211:9090",
|
|
"path": "/api/v1/namespaces/<namespace>/deployments/<name>",
|
|
"method": "GET",
|
|
"namespace": "system",
|
|
"status": "500",
|
|
}
|
|
|
|
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/<namespace>/deployments/<name>",
|
|
"method": "GET",
|
|
"namespace": "system",
|
|
"status": "500",
|
|
}
|
|
ls := tsdb.LabelsFromMap(m)
|
|
|
|
var v string
|
|
|
|
for _, l := range ls {
|
|
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
|
|
})
|
|
}
|
|
}
|