From 54a03cb143744322b83bfc5ba36bc77cf93644a6 Mon Sep 17 00:00:00 2001 From: Maxim Ivanov Date: Thu, 16 Apr 2020 22:24:40 +0100 Subject: [PATCH] Add benchmark for various composite encoder implementations ``` BenchmarkBinaryEncodingManual-12 824053234 28.9 ns/op 0 B/op 0 allocs/op BenchmarkBinaryEncodingHelper-12 76815436 314 ns/op 192 B/op 5 allocs/op BenchmarkBinaryEncodingRow-12 65302958 364 ns/op 192 B/op 5 allocs/op ``` --- composite_bench_test.go | 70 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 composite_bench_test.go diff --git a/composite_bench_test.go b/composite_bench_test.go new file mode 100644 index 00000000..a1eba72b --- /dev/null +++ b/composite_bench_test.go @@ -0,0 +1,70 @@ +package pgtype_test + +import ( + "testing" + + "github.com/jackc/pgtype" + "github.com/jackc/pgtype/binary" +) + +type MyCompositeRaw struct { + a int32 + b *string +} + +func (src MyCompositeRaw) EncodeBinary(ci *pgtype.ConnInfo, buf []byte) (newBuf []byte, err error) { + a := pgtype.Int4{src.a, pgtype.Present} + + fieldBytes := make([]byte, 0, 64) + fieldBytes, _ = a.EncodeBinary(ci, fieldBytes[:0]) + + newBuf = binary.RecordStart(buf, 2) + newBuf = binary.RecordAdd(newBuf, pgtype.Int4OID, fieldBytes) + + if src.b != nil { + fieldBytes, _ = pgtype.Text{*src.b, pgtype.Present}.EncodeBinary(ci, fieldBytes[:0]) + newBuf = binary.RecordAdd(newBuf, pgtype.TextOID, fieldBytes) + } else { + newBuf = binary.RecordAddNull(newBuf, pgtype.TextOID) + } + return +} + +var x []byte + +func BenchmarkBinaryEncodingManual(b *testing.B) { + buf := make([]byte, 0, 128) + ci := pgtype.NewConnInfo() + + b.ResetTimer() + for n := 0; n < b.N; n++ { + v := MyCompositeRaw{4, ptrS("ABCDEFG")} + buf, _ = v.EncodeBinary(ci, buf[:0]) + } + x = buf +} + +func BenchmarkBinaryEncodingHelper(b *testing.B) { + buf := make([]byte, 0, 128) + ci := pgtype.NewConnInfo() + + b.ResetTimer() + for n := 0; n < b.N; n++ { + v := MyType{4, ptrS("ABCDEFG")} + buf, _ = v.EncodeBinary(ci, buf[:0]) + } + x = buf +} + +func BenchmarkBinaryEncodingRow(b *testing.B) { + buf := make([]byte, 0, 128) + ci := pgtype.NewConnInfo() + + b.ResetTimer() + for n := 0; n < b.N; n++ { + c := pgtype.Composite(&pgtype.Int4{}, &pgtype.Text{}) + c.Set(pgtype.Row(2, "bar")) + buf, _ = c.EncodeBinary(ci, buf[:0]) + } + x = buf +}