Просмотр исходного кода

Use pools for obfuscated2 write

tags/v1.0.4^2
9seconds 6 лет назад
Родитель
Сommit
d72ed03a43
1 измененных файлов: 30 добавлений и 2 удалений
  1. 30
    2
      wrappers/stream/obfuscated2.go

+ 30
- 2
wrappers/stream/obfuscated2.go Просмотреть файл

@@ -1,9 +1,11 @@
1 1
 package stream
2 2
 
3 3
 import (
4
+	"bytes"
4 5
 	"crypto/cipher"
5 6
 	"fmt"
6 7
 	"net"
8
+	"sync"
7 9
 	"time"
8 10
 
9 11
 	"go.uber.org/zap"
@@ -11,6 +13,26 @@ import (
11 13
 	"github.com/9seconds/mtg/conntypes"
12 14
 )
13 15
 
16
+var (
17
+	poolWrapperObfuscated2WritePool = sync.Pool{
18
+		New: func() interface{} {
19
+			return &bytes.Buffer{}
20
+		},
21
+	}
22
+)
23
+
24
+func poolWrapperObfuscated2WritePoolAcquire(size int) *bytes.Buffer {
25
+	buf := poolWrapperObfuscated2WritePool.Get().(*bytes.Buffer)
26
+	buf.Grow(size)
27
+
28
+	return buf
29
+}
30
+
31
+func poolWrapperObfuscated2WritePoolRelease(buf *bytes.Buffer) {
32
+	buf.Reset()
33
+	poolWrapperObfuscated2WritePool.Put(buf)
34
+}
35
+
14 36
 type wrapperObfuscated2 struct {
15 37
 	encryptor cipher.Stream
16 38
 	decryptor cipher.Stream
@@ -40,7 +62,10 @@ func (w *wrapperObfuscated2) Read(p []byte) (int, error) {
40 62
 }
41 63
 
42 64
 func (w *wrapperObfuscated2) WriteTimeout(p []byte, timeout time.Duration) (int, error) {
43
-	buf := make([]byte, len(p))
65
+	buffer := poolWrapperObfuscated2WritePoolAcquire(len(p))
66
+	defer poolWrapperObfuscated2WritePoolRelease(buffer)
67
+
68
+	buf := buffer.Bytes()
44 69
 	copy(buf, p)
45 70
 	w.encryptor.XORKeyStream(buf, buf)
46 71
 
@@ -48,7 +73,10 @@ func (w *wrapperObfuscated2) WriteTimeout(p []byte, timeout time.Duration) (int,
48 73
 }
49 74
 
50 75
 func (w *wrapperObfuscated2) Write(p []byte) (int, error) {
51
-	buf := make([]byte, len(p))
76
+	buffer := poolWrapperObfuscated2WritePoolAcquire(len(p))
77
+	defer poolWrapperObfuscated2WritePoolRelease(buffer)
78
+
79
+	buf := buffer.Bytes()
52 80
 	copy(buf, p)
53 81
 	w.encryptor.XORKeyStream(buf, buf)
54 82
 

Загрузка…
Отмена
Сохранить