From 9e8752e7a2babb1608e9e5b7ea34e582128abacd Mon Sep 17 00:00:00 2001 From: Tamir Duberstein Date: Sun, 6 Mar 2016 17:28:09 -0500 Subject: [PATCH] transport: allocate bigger slabs and reuse MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This provides a substantial speed improvement with large payloads. Benchmarked using https://github.com/cockroachdb/rpc-bench: ``` name old time/op new time/op delta GRPCServeHTTP_1K-4 178µs ± 2% 177µs ± 1% ~ (p=1.000 n=5+5) GRPCServeHTTP_64K-4 1.30ms ± 3% 1.09ms ± 4% -16.82% (p=0.008 n=5+5) name old speed new speed delta GRPCServeHTTP_1K-4 11.5MB/s ± 2% 11.6MB/s ± 1% ~ (p=1.000 n=5+5) GRPCServeHTTP_64K-4 100MB/s ± 2% 121MB/s ± 4% +20.26% (p=0.008 n=5+5) name old alloc/op new alloc/op delta GRPCServeHTTP_1K-4 88.5kB ± 0% 93.9kB ± 0% +6.16% (p=0.008 n=5+5) GRPCServeHTTP_64K-4 801kB ± 0% 791kB ± 0% -1.16% (p=0.008 n=5+5) name old allocs/op new allocs/op delta GRPCServeHTTP_1K-4 162 ± 0% 156 ± 0% -3.70% (p=0.008 n=5+5) GRPCServeHTTP_64K-4 645 ± 0% 284 ± 0% -55.96% (p=0.016 n=5+4) ``` --- transport/handler_server.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/transport/handler_server.go b/transport/handler_server.go index d7e18a0b..fef541db 100644 --- a/transport/handler_server.go +++ b/transport/handler_server.go @@ -313,16 +313,22 @@ func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream)) { readerDone := make(chan struct{}) go func() { defer close(readerDone) - for { - buf := make([]byte, 1024) // TODO: minimize garbage, optimize recvBuffer code/ownership + + // TODO: minimize garbage, optimize recvBuffer code/ownership + const readSize = 8196 + for buf := make([]byte, readSize); ; { n, err := req.Body.Read(buf) if n > 0 { - s.buf.put(&recvMsg{data: buf[:n]}) + s.buf.put(&recvMsg{data: buf[:n:n]}) + buf = buf[n:] } if err != nil { s.buf.put(&recvMsg{err: mapRecvMsgError(err)}) return } + if len(buf) == 0 { + buf = make([]byte, readSize) + } } }()