remove proto object allocs on streaming benchmark server

This commit is contained in:
Alexander Polcyn
2016-12-21 10:29:00 -08:00
parent 09aecb094e
commit 47b25d4b97

View File

@ -47,7 +47,8 @@ import (
"google.golang.org/grpc/grpclog" "google.golang.org/grpc/grpclog"
) )
func newPayload(t testpb.PayloadType, size int) *testpb.Payload { // allows reuse of the same testpb.Payload object
func setPayload(p *testpb.Payload, t testpb.PayloadType, size int) {
if size < 0 { if size < 0 {
grpclog.Fatalf("Requested a response with invalid length %d", size) grpclog.Fatalf("Requested a response with invalid length %d", size)
} }
@ -59,10 +60,15 @@ func newPayload(t testpb.PayloadType, size int) *testpb.Payload {
default: default:
grpclog.Fatalf("Unsupported payload type: %d", t) grpclog.Fatalf("Unsupported payload type: %d", t)
} }
return &testpb.Payload{ p.Type = t
Type: t, p.Body = body
Body: body, return
} }
func newPayload(t testpb.PayloadType, size int) *testpb.Payload {
p := new(testpb.Payload)
setPayload(p, t, size)
return p
} }
type testServer struct { type testServer struct {
@ -75,8 +81,12 @@ func (s *testServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (*
} }
func (s *testServer) StreamingCall(stream testpb.BenchmarkService_StreamingCallServer) error { func (s *testServer) StreamingCall(stream testpb.BenchmarkService_StreamingCallServer) error {
response := new(testpb.SimpleResponse)
payload := new(testpb.Payload)
in := new(testpb.SimpleRequest)
for { for {
in, err := stream.Recv() // use ServerStream directly to reuse the same testpb.SimpleRequest object
err := stream.(grpc.ServerStream).RecvMsg(in)
if err == io.EOF { if err == io.EOF {
// read done. // read done.
return nil return nil
@ -84,9 +94,9 @@ func (s *testServer) StreamingCall(stream testpb.BenchmarkService_StreamingCallS
if err != nil { if err != nil {
return err return err
} }
if err := stream.Send(&testpb.SimpleResponse{ setPayload(payload, in.ResponseType, int(in.ResponseSize))
Payload: newPayload(in.ResponseType, int(in.ResponseSize)), response.Payload = payload
}); err != nil { if err := stream.Send(response); err != nil {
return err return err
} }
} }