Avoid some allocations in recvMsg
Reading the header by hand avoids some allocations and improves the performance of recvMsg. benchmark old ns/op new ns/op delta BenchmarkClientStreamc1-8 125267 110733 -11.60% BenchmarkClientStreamc8-8 21561 20971 -2.74% BenchmarkClientStreamc64-8 13573 12825 -5.51% BenchmarkClientStreamc512-8 13937 13300 -4.57% BenchmarkClientUnaryc1-8 223208 257968 +15.57% BenchmarkClientUnaryc8-8 46168 45618 -1.19% BenchmarkClientUnaryc64-8 33740 33038 -2.08% BenchmarkClientUnaryc512-8 33137 32663 -1.43% BenchmarkClientStreamNoTracec1-8 115559 107506 -6.97% BenchmarkClientStreamNoTracec8-8 20853 20376 -2.29% BenchmarkClientStreamNoTracec64-8 12119 11935 -1.52% BenchmarkClientStreamNoTracec512-8 13087 12479 -4.65% BenchmarkClientUnaryNoTracec1-8 225577 244701 +8.48% BenchmarkClientUnaryNoTracec8-8 42211 41884 -0.77% BenchmarkClientUnaryNoTracec64-8 30313 29655 -2.17% BenchmarkClientUnaryNoTracec512-8 29914 29637 -0.93% benchmark old allocs new allocs delta BenchmarkClientStreamc1-8 46 40 -13.04% BenchmarkClientStreamc8-8 47 41 -12.77% BenchmarkClientStreamc64-8 46 40 -13.04% BenchmarkClientStreamc512-8 46 40 -13.04% BenchmarkClientUnaryc1-8 100 91 -9.00% BenchmarkClientUnaryc8-8 100 91 -9.00% BenchmarkClientUnaryc64-8 100 91 -9.00% BenchmarkClientUnaryc512-8 96 88 -8.33% BenchmarkClientStreamNoTracec1-8 42 36 -14.29% BenchmarkClientStreamNoTracec8-8 43 37 -13.95% BenchmarkClientStreamNoTracec64-8 42 36 -14.29% BenchmarkClientStreamNoTracec512-8 42 36 -14.29% BenchmarkClientUnaryNoTracec1-8 87 78 -10.34% BenchmarkClientUnaryNoTracec8-8 87 78 -10.34% BenchmarkClientUnaryNoTracec64-8 87 78 -10.34% BenchmarkClientUnaryNoTracec512-8 84 77 -8.33% benchmark old bytes new bytes delta BenchmarkClientStreamc1-8 2015 1919 -4.76% BenchmarkClientStreamc8-8 2016 1920 -4.76% BenchmarkClientStreamc64-8 2015 1919 -4.76% BenchmarkClientStreamc512-8 2007 1901 -5.28% BenchmarkClientUnaryc1-8 5981 5837 -2.41% BenchmarkClientUnaryc8-8 5980 5837 -2.39% BenchmarkClientUnaryc64-8 5956 5813 -2.40% BenchmarkClientUnaryc512-8 5743 5611 -2.30% BenchmarkClientStreamNoTracec1-8 1887 1791 -5.09% BenchmarkClientStreamNoTracec8-8 1888 1792 -5.08% BenchmarkClientStreamNoTracec64-8 1916 1789 -6.63% BenchmarkClientStreamNoTracec512-8 1894 1811 -4.38% BenchmarkClientUnaryNoTracec1-8 4301 4158 -3.32% BenchmarkClientUnaryNoTracec8-8 4301 4157 -3.35% BenchmarkClientUnaryNoTracec64-8 4282 4140 -3.32% BenchmarkClientUnaryNoTracec512-8 4131 4077 -1.31%
This commit is contained in:
@ -139,9 +139,15 @@ type msgFixedHeader struct {
|
|||||||
// non-nil error is returned if something is wrong on reading.
|
// non-nil error is returned if something is wrong on reading.
|
||||||
func (p *parser) recvMsg() (pf payloadFormat, msg []byte, err error) {
|
func (p *parser) recvMsg() (pf payloadFormat, msg []byte, err error) {
|
||||||
var hdr msgFixedHeader
|
var hdr msgFixedHeader
|
||||||
if err := binary.Read(p.s, binary.BigEndian, &hdr); err != nil {
|
var buf [5]byte
|
||||||
|
|
||||||
|
if _, err := io.ReadFull(p.s, buf[:]); err != nil {
|
||||||
return 0, nil, err
|
return 0, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hdr.T = payloadFormat(uint8(buf[0]))
|
||||||
|
hdr.Length = binary.BigEndian.Uint32(buf[1:])
|
||||||
|
|
||||||
if hdr.Length == 0 {
|
if hdr.Length == 0 {
|
||||||
return hdr.T, nil, nil
|
return hdr.T, nil, nil
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user