Kaynağa Gözat

Reuse buffers for stream cipher

tags/0.11
9seconds 7 yıl önce
ebeveyn
işleme
0d0bdd9fde
2 değiştirilmiş dosya ile 27 ekleme ve 3 silme
  1. 11
    3
      wrappers/streamcipher.go
  2. 16
    0
      wrappers/streamcipher_pool.go

+ 11
- 3
wrappers/streamcipher.go Dosyayı Görüntüle

1
 package wrappers
1
 package wrappers
2
 
2
 
3
 import (
3
 import (
4
+	"bytes"
4
 	"crypto/cipher"
5
 	"crypto/cipher"
5
 	"net"
6
 	"net"
6
 
7
 
28
 }
29
 }
29
 
30
 
30
 func (s *StreamCipher) Write(p []byte) (int, error) {
31
 func (s *StreamCipher) Write(p []byte) (int, error) {
31
-	encrypted := make([]byte, len(p))
32
-	s.encryptor.XORKeyStream(encrypted, p)
32
+	buf := streamCipherBufferPool.Get().(*bytes.Buffer)
33
+	defer streamCipherBufferPool.Put(buf)
33
 
34
 
34
-	return s.conn.Write(encrypted)
35
+	buf.Reset()
36
+	buf.Grow(len(p))
37
+	buf.Write(p)
38
+
39
+	data := buf.Bytes()
40
+	s.encryptor.XORKeyStream(data, data)
41
+
42
+	return s.conn.Write(data)
35
 }
43
 }
36
 
44
 
37
 // Logger returns an instance of the logger for this wrapper.
45
 // Logger returns an instance of the logger for this wrapper.

+ 16
- 0
wrappers/streamcipher_pool.go Dosyayı Görüntüle

1
+package wrappers
2
+
3
+import (
4
+	"bytes"
5
+	"sync"
6
+)
7
+
8
+var streamCipherBufferPool sync.Pool
9
+
10
+func init() {
11
+	streamCipherBufferPool = sync.Pool{
12
+		New: func() interface{} {
13
+			return &bytes.Buffer{}
14
+		},
15
+	}
16
+}

Loading…
İptal
Kaydet