9 type BenchExample struct {
17 type BenchStrucExample struct {
18 Test [5]byte `struc:"[5]byte"`
20 B, C, D int `struc:"int16"`
21 Test2 [4]byte `struc:"[4]byte"`
22 Length int `struc:"int32,sizeof=Data"`
26 var benchRef = &BenchExample{
27 [5]byte{1, 2, 3, 4, 5},
33 var eightBytes = []byte("8bytestr")
35 var benchStrucRef = &BenchStrucExample{
36 [5]byte{1, 2, 3, 4, 5},
42 func BenchmarkEncode(b *testing.B) {
43 for i := 0; i < b.N; i++ {
45 err := Pack(&buf, benchStrucRef)
52 func BenchmarkStdlibEncode(b *testing.B) {
53 for i := 0; i < b.N; i++ {
55 err := binary.Write(&buf, binary.BigEndian, benchRef)
59 _, err = buf.Write(eightBytes)
66 func BenchmarkManualEncode(b *testing.B) {
67 order := binary.BigEndian
69 for i := 0; i < b.N; i++ {
71 tmp := make([]byte, 29)
72 copy(tmp[0:5], s.Test[:])
73 order.PutUint32(tmp[5:9], uint32(s.A))
74 order.PutUint16(tmp[9:11], uint16(s.B))
75 order.PutUint16(tmp[11:13], uint16(s.C))
76 order.PutUint16(tmp[13:15], uint16(s.D))
77 copy(tmp[15:19], s.Test2[:])
78 order.PutUint32(tmp[19:23], uint32(s.Length))
79 copy(tmp[23:], s.Data)
80 _, err := buf.Write(tmp)
87 func BenchmarkDecode(b *testing.B) {
88 var out BenchStrucExample
90 if err := Pack(&buf, benchStrucRef); err != nil {
93 bufBytes := buf.Bytes()
94 for i := 0; i < b.N; i++ {
95 buf := bytes.NewReader(bufBytes)
96 err := Unpack(buf, &out)
104 func BenchmarkStdlibDecode(b *testing.B) {
107 binary.Write(&buf, binary.BigEndian, *benchRef)
108 _, err := buf.Write(eightBytes)
112 bufBytes := buf.Bytes()
113 for i := 0; i < b.N; i++ {
114 buf := bytes.NewReader(bufBytes)
115 err := binary.Read(buf, binary.BigEndian, &out)
119 tmp := make([]byte, out.Length)
120 _, err = buf.Read(tmp)
127 func BenchmarkManualDecode(b *testing.B) {
128 var o BenchStrucExample
130 if err := Pack(&buf, benchStrucRef); err != nil {
134 order := binary.BigEndian
135 for i := 0; i < b.N; i++ {
136 copy(o.Test[:], tmp[0:5])
137 o.A = int(order.Uint32(tmp[5:9]))
138 o.B = int(order.Uint16(tmp[9:11]))
139 o.C = int(order.Uint16(tmp[11:13]))
140 o.D = int(order.Uint16(tmp[13:15]))
141 copy(o.Test2[:], tmp[15:19])
142 o.Length = int(order.Uint32(tmp[19:23]))
143 o.Data = make([]byte, o.Length)
144 copy(o.Data, tmp[23:])
148 func BenchmarkFullEncode(b *testing.B) {
149 for i := 0; i < b.N; i++ {
151 if err := Pack(&buf, reference); err != nil {
157 func BenchmarkFullDecode(b *testing.B) {
159 for i := 0; i < b.N; i++ {
160 buf := bytes.NewBuffer(referenceBytes)
161 if err := Unpack(buf, &out); err != nil {