Quellcode durchsuchen

Reduce memory allocation in vmess.

V2Ray vor 10 Jahren
Ursprung
Commit
787df1ab9b

+ 4 - 2
proxy/vmess/protocol/vmess.go

@@ -194,8 +194,10 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
 }
 
 // ToBytes returns a VMessRequest in the form of byte array.
-func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 user.RandomInt64InRange) ([]byte, error) {
-	buffer := make([]byte, 0, 300)
+func (request *VMessRequest) ToBytes(idHash user.CounterHash, randomRangeInt64 user.RandomInt64InRange, buffer []byte) ([]byte, error) {
+	if buffer == nil {
+		buffer = make([]byte, 0, 300)
+	}
 
 	counter := randomRangeInt64(time.Now().UTC().Unix(), 30)
 	hash := idHash.Hash(request.UserId.Bytes, counter)

+ 2 - 2
proxy/vmess/protocol/vmess_test.go

@@ -45,7 +45,7 @@ func TestVMessSerialization(t *testing.T) {
 	request.Address = v2net.DomainAddress("v2ray.com", 80)
 
 	mockTime := int64(1823730)
-	buffer, err := request.ToBytes(user.NewTimeHash(user.HMACHash{}), func(base int64, delta int) int64 { return mockTime })
+	buffer, err := request.ToBytes(user.NewTimeHash(user.HMACHash{}), func(base int64, delta int) int64 { return mockTime }, nil)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -85,6 +85,6 @@ func BenchmarkVMessRequestWriting(b *testing.B) {
 	request.Address = v2net.DomainAddress("v2ray.com", 80)
 
 	for i := 0; i < b.N; i++ {
-		request.ToBytes(user.NewTimeHash(user.HMACHash{}), user.GenerateRandomInt64InRange)
+		request.ToBytes(user.NewTimeHash(user.HMACHash{}), user.GenerateRandomInt64InRange, nil)
 	}
 }

+ 1 - 1
proxy/vmess/vmessin.go

@@ -93,7 +93,7 @@ func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error
 	}
 
 	// Optimize for small response packet
-	buffer := make([]byte, 0, 1024)
+	buffer := make([]byte, 0, 2*1024)
 	buffer = append(buffer, response[:]...)
 
 	if data, open := <-output; open {

+ 2 - 1
proxy/vmess/vmessout.go

@@ -130,7 +130,8 @@ func handleRequest(conn *net.TCPConn, request *protocol.VMessRequest, input <-ch
 		return
 	}
 
-	buffer, err := request.ToBytes(user.NewTimeHash(user.HMACHash{}), user.GenerateRandomInt64InRange)
+	buffer := make([]byte, 0, 2*1024)
+	buffer, err = request.ToBytes(user.NewTimeHash(user.HMACHash{}), user.GenerateRandomInt64InRange, buffer)
 	if err != nil {
 		log.Error("VMessOut: Failed to serialize VMess request: %v", err)
 		return