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

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
 package stream
1
 package stream
2
 
2
 
3
 import (
3
 import (
4
+	"bytes"
4
 	"crypto/cipher"
5
 	"crypto/cipher"
5
 	"fmt"
6
 	"fmt"
6
 	"net"
7
 	"net"
8
+	"sync"
7
 	"time"
9
 	"time"
8
 
10
 
9
 	"go.uber.org/zap"
11
 	"go.uber.org/zap"
11
 	"github.com/9seconds/mtg/conntypes"
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
 type wrapperObfuscated2 struct {
36
 type wrapperObfuscated2 struct {
15
 	encryptor cipher.Stream
37
 	encryptor cipher.Stream
16
 	decryptor cipher.Stream
38
 	decryptor cipher.Stream
40
 }
62
 }
41
 
63
 
42
 func (w *wrapperObfuscated2) WriteTimeout(p []byte, timeout time.Duration) (int, error) {
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
 	copy(buf, p)
69
 	copy(buf, p)
45
 	w.encryptor.XORKeyStream(buf, buf)
70
 	w.encryptor.XORKeyStream(buf, buf)
46
 
71
 
48
 }
73
 }
49
 
74
 
50
 func (w *wrapperObfuscated2) Write(p []byte) (int, error) {
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
 	copy(buf, p)
80
 	copy(buf, p)
53
 	w.encryptor.XORKeyStream(buf, buf)
81
 	w.encryptor.XORKeyStream(buf, buf)
54
 
82
 

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