Don't create buffer if compressor is nil
diff --git a/call.go b/call.go
index 3cc8f1f..f29396a 100644
--- a/call.go
+++ b/call.go
@@ -81,7 +81,11 @@
 			}
 		}
 	}()
-	outBuf, err := encode(codec, args, compressor, new(bytes.Buffer))
+	var cbuf *bytes.Buffer
+	if compressor != nil {
+		cbuf = new(bytes.Buffer)
+	}
+	outBuf, err := encode(codec, args, compressor, cbuf)
 	if err != nil {
 		return nil, transport.StreamErrorf(codes.Internal, "grpc: %v", err)
 	}
diff --git a/server.go b/server.go
index e846f3b..a7ff16c 100644
--- a/server.go
+++ b/server.go
@@ -303,7 +303,11 @@
 }
 
 func (s *Server) sendResponse(t transport.ServerTransport, stream *transport.Stream, msg interface{}, cp Compressor, opts *transport.Options) error {
-	p, err := encode(s.opts.codec, msg, cp, new(bytes.Buffer))
+	var cbuf *bytes.Buffer
+	if cp != nil {
+		cbuf = new(bytes.Buffer)
+	}
+	p, err := encode(s.opts.codec, msg, cp, cbuf)
 	if err != nil {
 		// This typically indicates a fatal issue (e.g., memory
 		// corruption or hardware faults) the application program
@@ -457,6 +461,9 @@
 		dg:     s.opts.dg,
 		trInfo: trInfo,
 	}
+	if cp != nil {
+		ss.cbuf = new(bytes.Buffer)
+	}
 	if trInfo != nil {
 		trInfo.tr.LazyLog(&trInfo.firstLine, false)
 		defer func() {
diff --git a/stream.go b/stream.go
index 1a8d0e4..63f934d 100644
--- a/stream.go
+++ b/stream.go
@@ -124,6 +124,10 @@
 		dg:      cc.dopts.dg,
 		tracing: EnableTracing,
 	}
+	if cp != nil {
+		callHdr.SendCompress = cp.Type()
+		cs.cbuf = new(bytes.Buffer)
+	}
 	if cs.tracing {
 		cs.trInfo.tr = trace.New("grpc.Sent."+methodFamily(method), method)
 		cs.trInfo.firstLine.client = true
@@ -164,7 +168,7 @@
 	desc  *StreamDesc
 	codec Codec
 	cp    Compressor
-	cbuf  bytes.Buffer
+	cbuf  *bytes.Buffer
 	dg    DecompressorGenerator
 
 	tracing bool // set to EnableTracing when the clientStream is created.
@@ -211,8 +215,12 @@
 		}
 		err = toRPCErr(err)
 	}()
-	out, err := encode(cs.codec, m, cs.cp, &cs.cbuf)
-	defer cs.cbuf.Reset()
+	out, err := encode(cs.codec, m, cs.cp, cs.cbuf)
+	defer func() {
+		if cs.cbuf != nil {
+			cs.cbuf.Reset()
+		}
+	}()
 	if err != nil {
 		return transport.StreamErrorf(codes.Internal, "grpc: %v", err)
 	}
@@ -326,7 +334,7 @@
 	codec      Codec
 	cp         Compressor
 	dg         DecompressorGenerator
-	cbuf       bytes.Buffer
+	cbuf       *bytes.Buffer
 	statusCode codes.Code
 	statusDesc string
 	trInfo     *traceInfo
@@ -365,8 +373,12 @@
 			ss.mu.Unlock()
 		}
 	}()
-	out, err := encode(ss.codec, m, ss.cp, &ss.cbuf)
-	defer ss.cbuf.Reset()
+	out, err := encode(ss.codec, m, ss.cp, ss.cbuf)
+	defer func() {
+		if ss.cbuf != nil {
+			ss.cbuf.Reset()
+		}
+	}()
 	if err != nil {
 		err = transport.StreamErrorf(codes.Internal, "grpc: %v", err)
 		return err