From 47b25d4b974c2618e2a75b3e7502a345868a092f Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 21 Dec 2016 10:29:00 -0800 Subject: [PATCH 1/3] remove proto object allocs on streaming benchmark server --- benchmark/benchmark.go | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/benchmark/benchmark.go b/benchmark/benchmark.go index d1143270..929c1445 100644 --- a/benchmark/benchmark.go +++ b/benchmark/benchmark.go @@ -47,7 +47,8 @@ import ( "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 { grpclog.Fatalf("Requested a response with invalid length %d", size) } @@ -59,10 +60,15 @@ func newPayload(t testpb.PayloadType, size int) *testpb.Payload { default: grpclog.Fatalf("Unsupported payload type: %d", t) } - return &testpb.Payload{ - Type: t, - Body: body, - } + p.Type = t + p.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 { @@ -75,8 +81,12 @@ func (s *testServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (* } func (s *testServer) StreamingCall(stream testpb.BenchmarkService_StreamingCallServer) error { + response := new(testpb.SimpleResponse) + payload := new(testpb.Payload) + in := new(testpb.SimpleRequest) 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 { // read done. return nil @@ -84,9 +94,9 @@ func (s *testServer) StreamingCall(stream testpb.BenchmarkService_StreamingCallS if err != nil { return err } - if err := stream.Send(&testpb.SimpleResponse{ - Payload: newPayload(in.ResponseType, int(in.ResponseSize)), - }); err != nil { + setPayload(payload, in.ResponseType, int(in.ResponseSize)) + response.Payload = payload + if err := stream.Send(response); err != nil { return err } } From a0bd789da94fec3176d59d3821ab3466404d6a29 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Thu, 9 Feb 2017 16:12:53 -0800 Subject: [PATCH 2/3] fix wording --- benchmark/benchmark.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/benchmark.go b/benchmark/benchmark.go index 929c1445..b5fa69b8 100644 --- a/benchmark/benchmark.go +++ b/benchmark/benchmark.go @@ -47,7 +47,7 @@ import ( "google.golang.org/grpc/grpclog" ) -// allows reuse of the same testpb.Payload object +// Allows reuse of the same testpb.Payload object. func setPayload(p *testpb.Payload, t testpb.PayloadType, size int) { if size < 0 { grpclog.Fatalf("Requested a response with invalid length %d", size) From bcc367f3431e7987e55a6380b1f3d49facca9b31 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Thu, 9 Feb 2017 16:16:18 -0800 Subject: [PATCH 3/3] get rid of extra payload local variable --- benchmark/benchmark.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/benchmark/benchmark.go b/benchmark/benchmark.go index b5fa69b8..fc3304ac 100644 --- a/benchmark/benchmark.go +++ b/benchmark/benchmark.go @@ -81,8 +81,9 @@ func (s *testServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (* } func (s *testServer) StreamingCall(stream testpb.BenchmarkService_StreamingCallServer) error { - response := new(testpb.SimpleResponse) - payload := new(testpb.Payload) + response := &testpb.SimpleResponse{ + Payload: new(testpb.Payload), + } in := new(testpb.SimpleRequest) for { // use ServerStream directly to reuse the same testpb.SimpleRequest object @@ -94,8 +95,7 @@ func (s *testServer) StreamingCall(stream testpb.BenchmarkService_StreamingCallS if err != nil { return err } - setPayload(payload, in.ResponseType, int(in.ResponseSize)) - response.Payload = payload + setPayload(response.Payload, in.ResponseType, int(in.ResponseSize)) if err := stream.Send(response); err != nil { return err }