Skip to content

Commit 0752b3f

Browse files
committed
protobuf: add marshaling benchmarks for some protobuf messages
The benchmarks that are added are related to certain areas that are considered hotspots for performance where many messages are marshaled. Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
1 parent b82235c commit 0752b3f

File tree

2 files changed

+187
-0
lines changed

2 files changed

+187
-0
lines changed
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package moby_buildkit_v1 //nolint:revive
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
digest "github.com/opencontainers/go-digest"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
// Buf is used to prevent the benchmark from being optimized away.
12+
var Buf []byte
13+
14+
func BenchmarkMarshalVertex(b *testing.B) {
15+
v := sampleVertex()
16+
for i := 0; i < b.N; i++ {
17+
var err error
18+
Buf, err = v.Marshal()
19+
require.NoError(b, err)
20+
}
21+
}
22+
23+
func BenchmarkMarshalVertexStatus(b *testing.B) {
24+
v := sampleVertexStatus()
25+
for i := 0; i < b.N; i++ {
26+
var err error
27+
Buf, err = v.Marshal()
28+
require.NoError(b, err)
29+
}
30+
}
31+
32+
func BenchmarkMarshalVertexLog(b *testing.B) {
33+
v := sampleVertexLog()
34+
for i := 0; i < b.N; i++ {
35+
var err error
36+
Buf, err = v.Marshal()
37+
require.NoError(b, err)
38+
}
39+
}
40+
41+
var VertexOutput Vertex
42+
43+
func BenchmarkUnmarshalVertex(b *testing.B) {
44+
v := sampleVertex()
45+
buf, err := v.Marshal()
46+
require.NoError(b, err)
47+
48+
for i := 0; i < b.N; i++ {
49+
err := VertexOutput.Unmarshal(buf)
50+
require.NoError(b, err)
51+
}
52+
}
53+
54+
var VertexStatusOutput VertexStatus
55+
56+
func BenchmarkUnmarshalVertexStatus(b *testing.B) {
57+
v := sampleVertexStatus()
58+
buf, err := v.Marshal()
59+
require.NoError(b, err)
60+
61+
for i := 0; i < b.N; i++ {
62+
err := VertexStatusOutput.Unmarshal(buf)
63+
require.NoError(b, err)
64+
}
65+
}
66+
67+
var VertexLogOutput VertexLog
68+
69+
func BenchmarkUnmarshalVertexLog(b *testing.B) {
70+
v := sampleVertexLog()
71+
buf, err := v.Marshal()
72+
require.NoError(b, err)
73+
74+
for i := 0; i < b.N; i++ {
75+
err := VertexLogOutput.Unmarshal(buf)
76+
require.NoError(b, err)
77+
}
78+
}
79+
80+
func sampleVertex() *Vertex {
81+
now := time.Now()
82+
started := now.Add(-time.Minute)
83+
return &Vertex{
84+
Digest: digest.FromString("abc"),
85+
Inputs: []digest.Digest{
86+
digest.FromString("dep1"),
87+
digest.FromString("dep2"),
88+
},
89+
Name: "abc",
90+
Started: &started,
91+
Completed: &now,
92+
}
93+
}
94+
95+
func sampleVertexStatus() *VertexStatus {
96+
now := time.Now()
97+
started := now.Add(-time.Minute)
98+
return &VertexStatus{
99+
ID: "abc",
100+
Vertex: digest.FromString("abc"),
101+
Name: "abc",
102+
Current: 1024,
103+
Total: 1024,
104+
Timestamp: now,
105+
Started: &started,
106+
Completed: &now,
107+
}
108+
}
109+
110+
func sampleVertexLog() *VertexLog {
111+
now := time.Now()
112+
return &VertexLog{
113+
Vertex: digest.FromString("abc"),
114+
Timestamp: now,
115+
Stream: 1,
116+
Msg: []byte("this is a log message"),
117+
}
118+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package contenthash
2+
3+
import (
4+
"testing"
5+
6+
digest "github.com/opencontainers/go-digest"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
// Buf is used to prevent the benchmark from being optimized away.
11+
var Buf []byte
12+
13+
func BenchmarkMarshalCacheRecords(b *testing.B) {
14+
v := sampleCacheRecords()
15+
for i := 0; i < b.N; i++ {
16+
var err error
17+
Buf, err = v.Marshal()
18+
require.NoError(b, err)
19+
}
20+
}
21+
22+
var CacheRecordsOutput CacheRecords
23+
24+
func BenchmarkUnmarshalCacheRecords(b *testing.B) {
25+
v := sampleCacheRecords()
26+
buf, err := v.Marshal()
27+
require.NoError(b, err)
28+
29+
for i := 0; i < b.N; i++ {
30+
err := CacheRecordsOutput.Unmarshal(buf)
31+
require.NoError(b, err)
32+
}
33+
}
34+
35+
func sampleCacheRecords() *CacheRecords {
36+
return &CacheRecords{
37+
Paths: []*CacheRecordWithPath{
38+
{
39+
Path: "/foo",
40+
Record: &CacheRecord{
41+
Digest: digest.FromString("/foo"),
42+
Type: CacheRecordTypeDir,
43+
},
44+
},
45+
{
46+
Path: "/foo/",
47+
Record: &CacheRecord{
48+
Digest: digest.FromString("/foo/"),
49+
Type: CacheRecordTypeDirHeader,
50+
},
51+
},
52+
{
53+
Path: "/foo/bar.txt",
54+
Record: &CacheRecord{
55+
Digest: digest.FromString("/foo/bar.txt"),
56+
Type: CacheRecordTypeFile,
57+
},
58+
},
59+
{
60+
Path: "/foo/link",
61+
Record: &CacheRecord{
62+
Digest: digest.FromString("/foo/link"),
63+
Type: CacheRecordTypeSymlink,
64+
Linkname: "/foo/bar.txt",
65+
},
66+
},
67+
},
68+
}
69+
}

0 commit comments

Comments
 (0)