Skip to content

Commit 0f41ced

Browse files
committed
Adding unsafe version of gencode
1 parent 75c9233 commit 0f41ced

4 files changed

+299
-2
lines changed

Makefile

+4-1
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@ structdef.capnp.go: structdef.capnp
2828

2929
gencode.schema.gen.go: gencode.schema
3030
gencode go -schema=gencode.schema -package=goserbench
31+
32+
gencode-unsafe.schema.gen.go: gencode-unsafe.schema
33+
gencode go -schema=gencode-unsafe.schema -package=goserbench -unsafe
3134

3235
.PHONY: clean
3336
clean:
34-
rm -f FlatBufferA.go msgp_gen.go structdef-gogo.pb.go structdef.pb.go vitess_test.go structdef.capnp.go structdef.capnp2.go gencode.schema.gen.go
37+
rm -f FlatBufferA.go msgp_gen.go structdef-gogo.pb.go structdef.pb.go vitess_test.go structdef.capnp.go structdef.capnp2.go gencode.schema.gen.go gencode-unsafe.schema.gen.go
3538

3639
.PHONY: install
3740
install:

gencode-unsafe.schema

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
struct GencodeUnsafeA {
2+
Name string
3+
BirthDay int64
4+
Phone string
5+
Siblings vint64
6+
Spouse bool
7+
Money float64
8+
}

gencode-unsafe.schema.gen.go

+234
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
package goserbench
2+
3+
import (
4+
"io"
5+
"time"
6+
"unsafe"
7+
)
8+
9+
var (
10+
_ = unsafe.Sizeof(0)
11+
_ = io.ReadFull
12+
_ = time.Now()
13+
)
14+
15+
type GencodeUnsafeA struct {
16+
Name string
17+
BirthDay int64
18+
Phone string
19+
Siblings int64
20+
Spouse bool
21+
Money float64
22+
}
23+
24+
func (d *GencodeUnsafeA) Size() (s uint64) {
25+
26+
{
27+
l := uint64(len(d.Name))
28+
29+
{
30+
31+
t := l
32+
for t >= 0x80 {
33+
t <<= 7
34+
s++
35+
}
36+
s++
37+
38+
}
39+
s += l
40+
}
41+
{
42+
l := uint64(len(d.Phone))
43+
44+
{
45+
46+
t := l
47+
for t >= 0x80 {
48+
t <<= 7
49+
s++
50+
}
51+
s++
52+
53+
}
54+
s += l
55+
}
56+
{
57+
58+
t := uint64(d.Siblings)
59+
t <<= 1
60+
if d.Siblings < 0 {
61+
t = ^t
62+
}
63+
for t >= 0x80 {
64+
t <<= 7
65+
s++
66+
}
67+
s++
68+
69+
}
70+
s += 17
71+
return
72+
}
73+
func (d *GencodeUnsafeA) Marshal(buf []byte) ([]byte, error) {
74+
size := d.Size()
75+
{
76+
if uint64(cap(buf)) >= size {
77+
buf = buf[:size]
78+
} else {
79+
buf = make([]byte, size)
80+
}
81+
}
82+
i := uint64(0)
83+
84+
{
85+
l := uint64(len(d.Name))
86+
87+
{
88+
89+
t := uint64(l)
90+
91+
for t >= 0x80 {
92+
buf[i+0] = byte(t) | 0x80
93+
t >>= 7
94+
i++
95+
}
96+
buf[i+0] = byte(t)
97+
i++
98+
99+
}
100+
copy(buf[i+0:], d.Name)
101+
i += l
102+
}
103+
{
104+
105+
d.BirthDay = *(*int64)(unsafe.Pointer(&buf[i+0]))
106+
107+
}
108+
{
109+
l := uint64(len(d.Phone))
110+
111+
{
112+
113+
t := uint64(l)
114+
115+
for t >= 0x80 {
116+
buf[i+8] = byte(t) | 0x80
117+
t >>= 7
118+
i++
119+
}
120+
buf[i+8] = byte(t)
121+
i++
122+
123+
}
124+
copy(buf[i+8:], d.Phone)
125+
i += l
126+
}
127+
{
128+
129+
t := uint64(d.Siblings)
130+
131+
t <<= 1
132+
if d.Siblings < 0 {
133+
t = ^t
134+
}
135+
136+
for t >= 0x80 {
137+
buf[i+8] = byte(t) | 0x80
138+
t >>= 7
139+
i++
140+
}
141+
buf[i+8] = byte(t)
142+
i++
143+
144+
}
145+
{
146+
if d.Spouse {
147+
buf[i+8] = 1
148+
} else {
149+
buf[i+8] = 0
150+
}
151+
}
152+
{
153+
154+
*(*float64)(unsafe.Pointer(&buf[i+9])) = d.Money
155+
156+
}
157+
return buf[:i+17], nil
158+
}
159+
160+
func (d *GencodeUnsafeA) Unmarshal(buf []byte) (uint64, error) {
161+
i := uint64(0)
162+
163+
{
164+
l := uint64(0)
165+
166+
{
167+
168+
bs := uint8(7)
169+
t := uint64(buf[i+0] & 0x7F)
170+
for buf[i+0]&0x80 == 0x80 {
171+
i++
172+
t |= uint64(buf[i+0]&0x7F) << bs
173+
bs += 7
174+
}
175+
i++
176+
177+
l = t
178+
179+
}
180+
d.Name = string(buf[i+0 : i+0+l])
181+
i += l
182+
}
183+
{
184+
185+
d.BirthDay = *(*int64)(unsafe.Pointer(&buf[i+0]))
186+
187+
}
188+
{
189+
l := uint64(0)
190+
191+
{
192+
193+
bs := uint8(7)
194+
t := uint64(buf[i+8] & 0x7F)
195+
for buf[i+8]&0x80 == 0x80 {
196+
i++
197+
t |= uint64(buf[i+8]&0x7F) << bs
198+
bs += 7
199+
}
200+
i++
201+
202+
l = t
203+
204+
}
205+
d.Phone = string(buf[i+8 : i+8+l])
206+
i += l
207+
}
208+
{
209+
210+
bs := uint8(7)
211+
t := uint64(buf[i+8] & 0x7F)
212+
for buf[i+8]&0x80 == 0x80 {
213+
i++
214+
t |= uint64(buf[i+8]&0x7F) << bs
215+
bs += 7
216+
}
217+
i++
218+
219+
d.Siblings = int64(t >> 1)
220+
if t&1 != 0 {
221+
d.Siblings = ^d.Siblings
222+
}
223+
224+
}
225+
{
226+
d.Spouse = buf[i+8] == 1
227+
}
228+
{
229+
230+
d.Money = *(*float64)(unsafe.Pointer(&buf[i+9]))
231+
232+
}
233+
return i + 17, nil
234+
}

serialization_benchmarks_test.go

+53-1
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,59 @@ func BenchmarkGencodeUnmarshal(b *testing.B) {
814814
o := &GencodeA{}
815815
_, err := o.Unmarshal(ser[n])
816816
if err != nil {
817-
b.Fatalf("goprotobuf failed to unmarshal: %s (%s)", err, ser[n])
817+
b.Fatalf("gencode failed to unmarshal: %s (%s)", err, ser[n])
818+
}
819+
// Validate unmarshalled data.
820+
if validate != "" {
821+
i := data[n]
822+
correct := o.Name == i.Name && o.Phone == i.Phone && o.Siblings == i.Siblings && o.Spouse == i.Spouse && o.Money == i.Money && o.BirthDay == i.BirthDay //&& cmpTags(o.Tags, i.Tags) && cmpAliases(o.Aliases, i.Aliases)
823+
if !correct {
824+
b.Fatalf("unmarshaled object differed:\n%v\n%v", i, o)
825+
}
826+
}
827+
}
828+
}
829+
830+
func generateGencodeUnsafe() []*GencodeUnsafeA {
831+
a := make([]*GencodeUnsafeA, 0, 1000)
832+
for i := 0; i < 1000; i++ {
833+
a = append(a, &GencodeUnsafeA{
834+
Name: randString(16),
835+
BirthDay: time.Now().UnixNano(),
836+
Phone: randString(10),
837+
Siblings: rand.Int63n(5),
838+
Spouse: rand.Intn(2) == 1,
839+
Money: rand.Float64(),
840+
})
841+
}
842+
return a
843+
}
844+
845+
func BenchmarkGencodeUnsafeMarshal(b *testing.B) {
846+
b.StopTimer()
847+
data := generateGencodeUnsafe()
848+
b.ReportAllocs()
849+
b.StartTimer()
850+
for i := 0; i < b.N; i++ {
851+
data[rand.Intn(len(data))].Marshal(nil)
852+
}
853+
}
854+
855+
func BenchmarkGencodeUnsafeUnmarshal(b *testing.B) {
856+
b.StopTimer()
857+
data := generateGencodeUnsafe()
858+
ser := make([][]byte, len(data))
859+
for i, d := range data {
860+
ser[i], _ = d.Marshal(nil)
861+
}
862+
b.ReportAllocs()
863+
b.StartTimer()
864+
for i := 0; i < b.N; i++ {
865+
n := rand.Intn(len(ser))
866+
o := &GencodeUnsafeA{}
867+
_, err := o.Unmarshal(ser[n])
868+
if err != nil {
869+
b.Fatalf("gencode failed to unmarshal: %s (%s)", err, ser[n])
818870
}
819871
// Validate unmarshalled data.
820872
if validate != "" {

0 commit comments

Comments
 (0)