Skip to content
This repository was archived by the owner on Aug 23, 2023. It is now read-only.

Commit 9203c66

Browse files
committed
improve performance of hashing seriesbytag with fnv
copy test files from schema
1 parent c7715cb commit 9203c66

14 files changed

+1345
-9
lines changed

schema/archive_test.go

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package schema
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestZeroArchive(t *testing.T) {
8+
var arch Archive // zero value
9+
method := arch.Method()
10+
if method != 0 {
11+
t.Fatalf("expected method 0, got %v", method)
12+
}
13+
span := arch.Span()
14+
if span != 0 {
15+
t.Fatalf("expected span 0, got %v", span)
16+
}
17+
}
18+
19+
func TestArchive(t *testing.T) {
20+
type c struct {
21+
method Method
22+
span uint32
23+
expArchive Archive
24+
expStr string
25+
}
26+
cases := []c{
27+
{Avg, 15, 0x301, "avg_15"},
28+
{Cnt, 120, 0x706, "cnt_120"},
29+
{Cnt, 3600, 0xF06, "cnt_3600"},
30+
{Lst, 7200, 0x1103, "lst_7200"},
31+
{Min, 6 * 3600, 0x1505, "min_21600"},
32+
{Cnt, 2, 0x6, "cnt_2"},
33+
{Avg, 5, 0x101, "avg_5"},
34+
{Cnt, 3600 + 30*60, 0x1006, "cnt_5400"},
35+
}
36+
for i, cas := range cases {
37+
arch := NewArchive(cas.method, cas.span)
38+
if arch != cas.expArchive {
39+
t.Fatalf("case %d: expected archive %d, got %d", i, cas.expArchive, arch)
40+
}
41+
str := arch.String()
42+
if str != cas.expStr {
43+
t.Fatalf("case %d: expected string %q, got %q", i, cas.expStr, str)
44+
}
45+
method := arch.Method()
46+
if method != cas.method {
47+
t.Fatalf("case %d: expected method %v, got %v", i, cas.method, method)
48+
}
49+
span := arch.Span()
50+
if span != cas.span {
51+
t.Fatalf("case %d: expected span %v, got %v", i, cas.span, span)
52+
}
53+
}
54+
}
55+
56+
func TestArchiveFromString(t *testing.T) {
57+
cases := []struct {
58+
str string
59+
expErr bool
60+
expArchive Archive
61+
}{
62+
{"_deeff", true, 0},
63+
{"_foo_bar_", true, 0},
64+
{"_sum_1800", true, 0},
65+
{"_SUM_1800", true, 0},
66+
{"sum_1800", false, NewArchive(Sum, 1800)},
67+
{"sum_1801", true, 0},
68+
{"SUM_1800", true, 0},
69+
{"min_600", false, NewArchive(Min, 600)},
70+
}
71+
72+
for i, c := range cases {
73+
archive, err := ArchiveFromString(c.str)
74+
if (err != nil) != c.expErr {
75+
t.Fatalf("case %d exp err %v got %v", i, c.expErr, err)
76+
}
77+
if err != nil {
78+
continue
79+
}
80+
if archive != c.expArchive {
81+
t.Fatalf("case %d exp Archive %v got %v", i, c.expArchive, archive)
82+
}
83+
}
84+
}

schema/key_test.go

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package schema
2+
3+
import (
4+
"math"
5+
"testing"
6+
)
7+
8+
func TestMKeyConversionBothWays(t *testing.T) {
9+
10+
cases := []struct {
11+
idStr string
12+
expErr bool
13+
expMKey MKey
14+
}{
15+
{".00112233445566778899aabbccddeeff", true, MKey{}},
16+
{"0.0112233445566778899aabbccddeeff", true, MKey{}},
17+
{"a.00112233445566778899aabbccddeeff", true, MKey{}},
18+
{"0.00112233445566778899aabbccddeeff", false, MKey{[16]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, 0}},
19+
{"1.00112233445566778899aabbccddeeff", false, MKey{[16]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, 1}},
20+
{"1234567.00112233445566778899aabbccddeeff", false, MKey{[16]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, 1234567}},
21+
{"4294967295.00112233445566778899aabbccddeeff", false, MKey{[16]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, math.MaxUint32}},
22+
}
23+
24+
for i, c := range cases {
25+
mk, err := MKeyFromString(c.idStr)
26+
if (err != nil) != c.expErr {
27+
t.Fatalf("case %d exp err %v got %v", i, c.expErr, err)
28+
}
29+
if err != nil {
30+
continue
31+
}
32+
if mk != c.expMKey {
33+
t.Fatalf("case %d exp MKey %v got %v", i, c.expMKey, mk)
34+
}
35+
str := mk.String()
36+
if str != c.idStr {
37+
t.Fatalf("case %d exp MKey.String() %v got %v", i, c.idStr, str)
38+
}
39+
}
40+
}
41+
42+
func TestAMKeyConversionBothWays(t *testing.T) {
43+
44+
cases := []struct {
45+
idStr string
46+
expErr bool
47+
expAMKey AMKey
48+
}{
49+
{".00112233445566778899aabbccd_deeff", true, AMKey{}},
50+
{"0.0112233445566778899aab_bccd_deeff", true, AMKey{}},
51+
{"0.00112233445566778899aabbccddeeff", false, AMKey{MKey{[16]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, 0}, 0}},
52+
{"0.00112233445566778899aabbccddeeff_min_600", false, AMKey{MKey{[16]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, 0}, NewArchive(Min, 600)}},
53+
}
54+
55+
for i, c := range cases {
56+
amk, err := AMKeyFromString(c.idStr)
57+
if (err != nil) != c.expErr {
58+
t.Fatalf("case %d exp err %v got %v", i, c.expErr, err)
59+
}
60+
if err != nil {
61+
continue
62+
}
63+
if amk != c.expAMKey {
64+
t.Fatalf("case %d exp MKey %v got %v", i, c.expAMKey, amk)
65+
}
66+
str := amk.String()
67+
if str != c.idStr {
68+
t.Fatalf("case %d exp MKey.String() %v got %v", i, c.idStr, str)
69+
}
70+
}
71+
}
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package schema
2+
3+
import (
4+
"bytes"
5+
"encoding/gob"
6+
"testing"
7+
)
8+
9+
func BenchmarkSerializeMetricDataArrayGob(b *testing.B) {
10+
metrics := getDifferentMetricDataArray(b.N)
11+
b.ResetTimer()
12+
var buf bytes.Buffer
13+
enc := gob.NewEncoder(&buf)
14+
err := enc.Encode(metrics)
15+
checkErr(b, err)
16+
b.Logf("with %10d metrics -> final size: %.1f bytes per metric", b.N, float64(buf.Len())/float64(b.N))
17+
}
18+
func BenchmarkDeSerializeMetricDataArrayGob(b *testing.B) {
19+
metrics := getDifferentMetricDataArray(b.N)
20+
var buf bytes.Buffer
21+
enc := gob.NewEncoder(&buf)
22+
err := enc.Encode(metrics)
23+
checkErr(b, err)
24+
var out []*MetricData
25+
b.ResetTimer()
26+
dec := gob.NewDecoder(&buf)
27+
err = dec.Decode(&out)
28+
checkErr(b, err)
29+
}
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package schema
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
)
7+
8+
func BenchmarkSerializeMetricDataArrayJson(b *testing.B) {
9+
metrics := getDifferentMetricDataArray(b.N)
10+
b.ResetTimer()
11+
data, err := json.Marshal(metrics)
12+
checkErr(b, err)
13+
b.Logf("with %10d metrics -> final size: %.1f bytes per metric", b.N, float64(len(data))/float64(b.N))
14+
}
15+
16+
func BenchmarkDeSerializeMetricDataArrayJson(b *testing.B) {
17+
metrics := getDifferentMetricDataArray(b.N)
18+
data, err := json.Marshal(metrics)
19+
checkErr(b, err)
20+
var out []*MetricData
21+
b.ResetTimer()
22+
err = json.Unmarshal(data, &out)
23+
checkErr(b, err)
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package schema
2+
3+
import "testing"
4+
5+
func BenchmarkSerializeMetricPointStaticBuffer(b *testing.B) {
6+
metrics := getDifferentMetricPoints(b.N)
7+
data := make([]byte, 0, b.N*32)
8+
b.ResetTimer()
9+
var err error
10+
for _, m := range metrics {
11+
data, err = m.Marshal32(data)
12+
checkErr(b, err)
13+
}
14+
b.Logf("with %10d metrics -> final size: %.1f bytes per metric", b.N, float64(len(data))/float64(b.N))
15+
}
16+
17+
func BenchmarkSerializeMetricPoint(b *testing.B) {
18+
metrics := getDifferentMetricPoints(b.N)
19+
b.ResetTimer()
20+
var data []byte
21+
var err error
22+
for _, m := range metrics {
23+
data, err = m.Marshal(data)
24+
checkErr(b, err)
25+
}
26+
b.Logf("with %10d metrics -> final size: %.1f bytes per metric", b.N, float64(len(data))/float64(b.N))
27+
}
28+
29+
func BenchmarkDeSerializeMetricPoint(b *testing.B) {
30+
metrics := getDifferentMetricPoints(b.N)
31+
var data []byte
32+
var err error
33+
for _, m := range metrics {
34+
data, err = m.Marshal(data)
35+
checkErr(b, err)
36+
}
37+
b.ResetTimer()
38+
p := &MetricPoint{}
39+
for len(data) != 0 {
40+
data, err = p.Unmarshal(data)
41+
checkErr(b, err)
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package schema
2+
3+
import "testing"
4+
5+
func BenchmarkSerializeMetricPointStaticBufferWithoutOrg(b *testing.B) {
6+
metrics := getDifferentMetricPoints(b.N)
7+
data := make([]byte, 0, b.N*28)
8+
b.ResetTimer()
9+
var err error
10+
for _, m := range metrics {
11+
data, err = m.MarshalWithoutOrg28(data)
12+
checkErr(b, err)
13+
}
14+
b.Logf("with %10d metrics -> final size: %.1f bytes per metric", b.N, float64(len(data))/float64(b.N))
15+
}
16+
17+
func BenchmarkSerializeMetricPointWithoutOrg(b *testing.B) {
18+
metrics := getDifferentMetricPoints(b.N)
19+
b.ResetTimer()
20+
var data []byte
21+
var err error
22+
for _, m := range metrics {
23+
data, err = m.MarshalWithoutOrg(data)
24+
checkErr(b, err)
25+
}
26+
b.Logf("with %10d metrics -> final size: %.1f bytes per metric", b.N, float64(len(data))/float64(b.N))
27+
}
28+
29+
func BenchmarkDeSerializeMetricPointWithoutOrg(b *testing.B) {
30+
metrics := getDifferentMetricPoints(b.N)
31+
var data []byte
32+
var err error
33+
for _, m := range metrics {
34+
data, err = m.MarshalWithoutOrg(data)
35+
checkErr(b, err)
36+
}
37+
b.ResetTimer()
38+
p := &MetricPoint{}
39+
for len(data) != 0 {
40+
data, err = p.UnmarshalWithoutOrg(data)
41+
checkErr(b, err)
42+
}
43+
}
+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package schema
2+
3+
import "testing"
4+
5+
func BenchmarkSerializeMetricDataArrayMsgp(b *testing.B) {
6+
metrics := getDifferentMetricDataArray(b.N)
7+
b.ResetTimer()
8+
m := MetricDataArray(metrics)
9+
data, err := m.MarshalMsg(nil)
10+
checkErr(b, err)
11+
b.Logf("with %10d metrics -> final size: %.1f bytes per metric", b.N, float64(len(data))/float64(b.N))
12+
}
13+
14+
func BenchmarkDeSerializeMetricDataArrayMsgp(b *testing.B) {
15+
metrics := getDifferentMetricDataArray(b.N)
16+
m := MetricDataArray(metrics)
17+
data, err := m.MarshalMsg(nil)
18+
checkErr(b, err)
19+
var out MetricDataArray
20+
b.ResetTimer()
21+
_, err = out.UnmarshalMsg(data)
22+
checkErr(b, err)
23+
}
24+
25+
func BenchmarkSerializeMetricDataMsgp(b *testing.B) {
26+
metrics := getDifferentMetricDataArray(b.N)
27+
b.ResetTimer()
28+
var data []byte
29+
var err error
30+
for _, m := range metrics {
31+
data, err = m.MarshalMsg(data)
32+
checkErr(b, err)
33+
}
34+
b.Logf("with %10d metrics -> final size: %.1f bytes per metric", b.N, float64(len(data))/float64(b.N))
35+
}
36+
37+
func BenchmarkDeSerializeMetricDataMsgp(b *testing.B) {
38+
metrics := getDifferentMetricDataArray(b.N)
39+
var data []byte
40+
var err error
41+
for _, m := range metrics {
42+
data, err = m.MarshalMsg(data)
43+
checkErr(b, err)
44+
}
45+
b.ResetTimer()
46+
p := &MetricData{}
47+
for len(data) != 0 {
48+
data, err = p.UnmarshalMsg(data)
49+
checkErr(b, err)
50+
}
51+
}

0 commit comments

Comments
 (0)