Explorar el Código

Reuse buffers for stream cipher

tags/0.11
9seconds hace 7 años
padre
commit
0d0bdd9fde
Se han modificado 2 ficheros con 27 adiciones y 3 borrados
  1. 11
    3
      wrappers/streamcipher.go
  2. 16
    0
      wrappers/streamcipher_pool.go

+ 11
- 3
wrappers/streamcipher.go Ver fichero

@@ -1,6 +1,7 @@
1 1
 package wrappers
2 2
 
3 3
 import (
4
+	"bytes"
4 5
 	"crypto/cipher"
5 6
 	"net"
6 7
 
@@ -28,10 +29,17 @@ func (s *StreamCipher) Read(p []byte) (int, error) {
28 29
 }
29 30
 
30 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 45
 // Logger returns an instance of the logger for this wrapper.

+ 16
- 0
wrappers/streamcipher_pool.go Ver fichero

@@ -0,0 +1,16 @@
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…
Cancelar
Guardar