Browse Source

benchmark mux frame

Darien Raymond 7 years ago
parent
commit
ff7e5a7cdb
4 changed files with 43 additions and 9 deletions
  1. 10 0
      common/buf/buffer.go
  2. 7 8
      common/mux/frame.go
  3. 25 0
      common/mux/frame_test.go
  4. 1 1
      common/protocol/address.go

+ 10 - 0
common/buf/buffer.go

@@ -144,6 +144,16 @@ func (b *Buffer) WriteBytes(bytes ...byte) (int, error) {
 	return b.Write(bytes)
 	return b.Write(bytes)
 }
 }
 
 
+// WriteByte writes a single byte into the buffer.
+func (b *Buffer) WriteByte(v byte) error {
+	if b.IsFull() {
+		return newError("buffer full")
+	}
+	b.v[b.end] = v
+	b.end++
+	return nil
+}
+
 // WriteString implements io.StringWriter.
 // WriteString implements io.StringWriter.
 func (b *Buffer) WriteString(s string) (int, error) {
 func (b *Buffer) WriteString(s string) (int, error) {
 	return b.Write([]byte(s))
 	return b.Write([]byte(s))

+ 7 - 8
common/mux/frame.go

@@ -61,22 +61,21 @@ type FrameMetadata struct {
 }
 }
 
 
 func (f FrameMetadata) WriteTo(b *buf.Buffer) error {
 func (f FrameMetadata) WriteTo(b *buf.Buffer) error {
-	common.Must2(b.WriteBytes(0x00, 0x00))
-	lenBytes := b.Bytes()
+	lenBytes := b.Extend(2)
 
 
 	len0 := b.Len()
 	len0 := b.Len()
-	if _, err := serial.WriteUint16(b, f.SessionID); err != nil {
-		return err
-	}
+	sessionBytes := b.Extend(2)
+	binary.BigEndian.PutUint16(sessionBytes, f.SessionID)
 
 
-	common.Must2(b.WriteBytes(byte(f.SessionStatus), byte(f.Option)))
+	common.Must(b.WriteByte(byte(f.SessionStatus)))
+	common.Must(b.WriteByte(byte(f.Option)))
 
 
 	if f.SessionStatus == SessionStatusNew {
 	if f.SessionStatus == SessionStatusNew {
 		switch f.Target.Network {
 		switch f.Target.Network {
 		case net.Network_TCP:
 		case net.Network_TCP:
-			common.Must2(b.WriteBytes(byte(TargetNetworkTCP)))
+			common.Must(b.WriteByte(byte(TargetNetworkTCP)))
 		case net.Network_UDP:
 		case net.Network_UDP:
-			common.Must2(b.WriteBytes(byte(TargetNetworkUDP)))
+			common.Must(b.WriteByte(byte(TargetNetworkUDP)))
 		}
 		}
 
 
 		if err := addrParser.WriteAddressPort(b, f.Target.Address, f.Target.Port); err != nil {
 		if err := addrParser.WriteAddressPort(b, f.Target.Address, f.Target.Port); err != nil {

+ 25 - 0
common/mux/frame_test.go

@@ -0,0 +1,25 @@
+package mux_test
+
+import (
+	"testing"
+
+	"v2ray.com/core/common"
+	"v2ray.com/core/common/buf"
+	"v2ray.com/core/common/mux"
+	"v2ray.com/core/common/net"
+)
+
+func BenchmarkFrameWrite(b *testing.B) {
+	frame := mux.FrameMetadata{
+		Target:        net.TCPDestination(net.DomainAddress("www.v2ray.com"), net.Port(80)),
+		SessionID:     1,
+		SessionStatus: mux.SessionStatusNew,
+	}
+	writer := buf.New()
+	defer writer.Release()
+
+	for i := 0; i < b.N; i++ {
+		common.Must(frame.WriteTo(writer))
+		writer.Clear()
+	}
+}

+ 1 - 1
common/protocol/address.go

@@ -246,7 +246,7 @@ func (p *addressParser) writeAddress(writer io.Writer, address net.Address) erro
 		if _, err := writer.Write([]byte{tb, byte(len(domain))}); err != nil {
 		if _, err := writer.Write([]byte{tb, byte(len(domain))}); err != nil {
 			return err
 			return err
 		}
 		}
-		if _, err := writer.Write([]byte(domain)); err != nil {
+		if _, err := io.WriteString(writer, domain); err != nil {
 			return err
 			return err
 		}
 		}
 	default:
 	default: