浏览代码

use Compress/Decompress directly without Reader/Writer/ioutil.WriteAll

Decompress guess the size first then decompress so generally it takes much
less allocation than iotuil.ReadAll which used a fixed buffer size of 512 bytes
when message size is larger than 512 bytes.

Creating ztsd.Reader for small messages is also costly because it
has to perform additional cgo calls to initialize the context, compare to just 2
cgo call to decompress with a nil dst slice.

Samething apply for Compress, it saves some cgo calls, and we dont reuse the writers anyway.
Daniel Dao 7 年之前
父节点
当前提交
90843c8714
共有 2 个文件被更改,包括 8 次插入20 次删除
  1. 4 10
      message.go
  2. 4 10
      record_batch.go

+ 4 - 10
message.go

@@ -116,15 +116,11 @@ func (m *Message) encode(pe packetEncoder) error {
 			m.compressedCache = buf.Bytes()
 			payload = m.compressedCache
 		case CompressionZSTD:
-			var buf bytes.Buffer
-			writer := zstd.NewWriterLevel(&buf, m.CompressionLevel)
-			if _, err = writer.Write(m.Value); err != nil {
+			c, err := zstd.CompressLevel(nil, m.Value, m.CompressionLevel)
+			if err != nil {
 				return err
 			}
-			if err = writer.Close(); err != nil {
-				return err
-			}
-			m.compressedCache = buf.Bytes()
+			m.compressedCache = c
 			payload = m.compressedCache
 		default:
 			return PacketEncodingError{fmt.Sprintf("unsupported compression codec (%d)", m.Codec)}
@@ -223,9 +219,7 @@ func (m *Message) decode(pd packetDecoder) (err error) {
 		if m.Value == nil {
 			break
 		}
-		reader := zstd.NewReader(bytes.NewReader(m.Value))
-		defer reader.Close()
-		if m.Value, err = ioutil.ReadAll(reader); err != nil {
+		if m.Value, err = zstd.Decompress(nil, m.Value); err != nil {
 			return err
 		}
 		if err := m.decodeSet(); err != nil {

+ 4 - 10
record_batch.go

@@ -195,9 +195,7 @@ func (b *RecordBatch) decode(pd packetDecoder) (err error) {
 			return err
 		}
 	case CompressionZSTD:
-		reader := zstd.NewReader(bytes.NewReader(recBuffer))
-		defer reader.Close()
-		if recBuffer, err = ioutil.ReadAll(reader); err != nil {
+		if recBuffer, err = zstd.Decompress(nil, recBuffer); err != nil {
 			return err
 		}
 	default:
@@ -256,15 +254,11 @@ func (b *RecordBatch) encodeRecords(pe packetEncoder) error {
 		}
 		b.compressedRecords = buf.Bytes()
 	case CompressionZSTD:
-		var buf bytes.Buffer
-		writer := zstd.NewWriterLevel(&buf, b.CompressionLevel)
-		if _, err = writer.Write(raw); err != nil {
-			return err
-		}
-		if err = writer.Close(); err != nil {
+		c, err := zstd.CompressLevel(nil, raw, b.CompressionLevel)
+		if err != nil {
 			return err
 		}
-		b.compressedRecords = buf.Bytes()
+		b.compressedRecords = c
 	default:
 		return PacketEncodingError{fmt.Sprintf("unsupported compression codec (%d)", b.Codec)}
 	}