...

Source file src/github.com/jackc/pgtype/composite_bench_test.go

Documentation: github.com/jackc/pgtype

     1  package pgtype_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/jackc/pgio"
     7  	"github.com/jackc/pgtype"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  type MyCompositeRaw struct {
    12  	A int32
    13  	B *string
    14  }
    15  
    16  func (src MyCompositeRaw) EncodeBinary(ci *pgtype.ConnInfo, buf []byte) ([]byte, error) {
    17  	buf = pgio.AppendUint32(buf, 2)
    18  
    19  	buf = pgio.AppendUint32(buf, pgtype.Int4OID)
    20  	buf = pgio.AppendInt32(buf, 4)
    21  	buf = pgio.AppendInt32(buf, src.A)
    22  
    23  	buf = pgio.AppendUint32(buf, pgtype.TextOID)
    24  	if src.B != nil {
    25  		buf = pgio.AppendInt32(buf, int32(len(*src.B)))
    26  		buf = append(buf, (*src.B)...)
    27  	} else {
    28  		buf = pgio.AppendInt32(buf, -1)
    29  	}
    30  
    31  	return buf, nil
    32  }
    33  
    34  func (dst *MyCompositeRaw) DecodeBinary(ci *pgtype.ConnInfo, src []byte) error {
    35  	a := pgtype.Int4{}
    36  	b := pgtype.Text{}
    37  
    38  	scanner := pgtype.NewCompositeBinaryScanner(ci, src)
    39  	scanner.ScanDecoder(&a)
    40  	scanner.ScanDecoder(&b)
    41  
    42  	if scanner.Err() != nil {
    43  		return scanner.Err()
    44  	}
    45  
    46  	dst.A = a.Int
    47  	if b.Status == pgtype.Present {
    48  		dst.B = &b.String
    49  	} else {
    50  		dst.B = nil
    51  	}
    52  
    53  	return nil
    54  }
    55  
    56  var x []byte
    57  
    58  func BenchmarkBinaryEncodingManual(b *testing.B) {
    59  	buf := make([]byte, 0, 128)
    60  	ci := pgtype.NewConnInfo()
    61  	v := MyCompositeRaw{4, ptrS("ABCDEFG")}
    62  
    63  	b.ResetTimer()
    64  	for n := 0; n < b.N; n++ {
    65  		buf, _ = v.EncodeBinary(ci, buf[:0])
    66  	}
    67  	x = buf
    68  }
    69  
    70  func BenchmarkBinaryEncodingHelper(b *testing.B) {
    71  	buf := make([]byte, 0, 128)
    72  	ci := pgtype.NewConnInfo()
    73  	v := MyType{4, ptrS("ABCDEFG")}
    74  
    75  	b.ResetTimer()
    76  	for n := 0; n < b.N; n++ {
    77  		buf, _ = v.EncodeBinary(ci, buf[:0])
    78  	}
    79  	x = buf
    80  }
    81  
    82  func BenchmarkBinaryEncodingComposite(b *testing.B) {
    83  	buf := make([]byte, 0, 128)
    84  	ci := pgtype.NewConnInfo()
    85  	f1 := 2
    86  	f2 := ptrS("bar")
    87  	c, err := pgtype.NewCompositeType("test", []pgtype.CompositeTypeField{
    88  		{"a", pgtype.Int4OID},
    89  		{"b", pgtype.TextOID},
    90  	}, ci)
    91  	require.NoError(b, err)
    92  
    93  	b.ResetTimer()
    94  	for n := 0; n < b.N; n++ {
    95  		c.Set([]interface{}{f1, f2})
    96  		buf, _ = c.EncodeBinary(ci, buf[:0])
    97  	}
    98  	x = buf
    99  }
   100  
   101  func BenchmarkBinaryEncodingJSON(b *testing.B) {
   102  	buf := make([]byte, 0, 128)
   103  	ci := pgtype.NewConnInfo()
   104  	v := MyCompositeRaw{4, ptrS("ABCDEFG")}
   105  	j := pgtype.JSON{}
   106  
   107  	b.ResetTimer()
   108  	for n := 0; n < b.N; n++ {
   109  		j.Set(v)
   110  		buf, _ = j.EncodeBinary(ci, buf[:0])
   111  	}
   112  	x = buf
   113  }
   114  
   115  var dstRaw MyCompositeRaw
   116  
   117  func BenchmarkBinaryDecodingManual(b *testing.B) {
   118  	ci := pgtype.NewConnInfo()
   119  	buf, _ := MyType{4, ptrS("ABCDEFG")}.EncodeBinary(ci, nil)
   120  	dst := MyCompositeRaw{}
   121  
   122  	b.ResetTimer()
   123  	for n := 0; n < b.N; n++ {
   124  		err := dst.DecodeBinary(ci, buf)
   125  		E(err)
   126  	}
   127  	dstRaw = dst
   128  }
   129  
   130  var dstMyType MyType
   131  
   132  func BenchmarkBinaryDecodingHelpers(b *testing.B) {
   133  	ci := pgtype.NewConnInfo()
   134  	buf, _ := MyType{4, ptrS("ABCDEFG")}.EncodeBinary(ci, nil)
   135  	dst := MyType{}
   136  
   137  	b.ResetTimer()
   138  	for n := 0; n < b.N; n++ {
   139  		err := dst.DecodeBinary(ci, buf)
   140  		E(err)
   141  	}
   142  	dstMyType = dst
   143  }
   144  
   145  var gf1 int
   146  var gf2 *string
   147  
   148  func BenchmarkBinaryDecodingCompositeScan(b *testing.B) {
   149  	ci := pgtype.NewConnInfo()
   150  	buf, _ := MyType{4, ptrS("ABCDEFG")}.EncodeBinary(ci, nil)
   151  	var f1 int
   152  	var f2 *string
   153  
   154  	c, err := pgtype.NewCompositeType("test", []pgtype.CompositeTypeField{
   155  		{"a", pgtype.Int4OID},
   156  		{"b", pgtype.TextOID},
   157  	}, ci)
   158  	require.NoError(b, err)
   159  
   160  	b.ResetTimer()
   161  	for n := 0; n < b.N; n++ {
   162  		err := c.DecodeBinary(ci, buf)
   163  		if err != nil {
   164  			b.Fatal(err)
   165  		}
   166  		err = c.AssignTo([]interface{}{&f1, &f2})
   167  		if err != nil {
   168  			b.Fatal(err)
   169  		}
   170  	}
   171  	gf1 = f1
   172  	gf2 = f2
   173  }
   174  
   175  func BenchmarkBinaryDecodingJSON(b *testing.B) {
   176  	ci := pgtype.NewConnInfo()
   177  	j := pgtype.JSON{}
   178  	j.Set(MyCompositeRaw{4, ptrS("ABCDEFG")})
   179  	buf, _ := j.EncodeBinary(ci, nil)
   180  
   181  	j = pgtype.JSON{}
   182  	dst := MyCompositeRaw{}
   183  
   184  	b.ResetTimer()
   185  	for n := 0; n < b.N; n++ {
   186  		err := j.DecodeBinary(ci, buf)
   187  		E(err)
   188  		err = j.AssignTo(&dst)
   189  		E(err)
   190  	}
   191  	dstRaw = dst
   192  }
   193  

View as plain text