Skip to content

Commit cb5dba8

Browse files
committed
Improve benchmark structure
1 parent cffa7f0 commit cb5dba8

File tree

1 file changed

+81
-76
lines changed

1 file changed

+81
-76
lines changed

websocket_test.go

Lines changed: 81 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -702,99 +702,104 @@ func checkWSTestIndex(t *testing.T, path string) {
702702
}
703703
}
704704

705-
func benchConn(b *testing.B, echo, stream bool) {
706-
name := "buffered"
707-
if stream {
708-
name = "stream"
705+
func benchConn(b *testing.B, echo, stream bool, size int) {
706+
s, closeFn := testServer(b, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
707+
c, err := websocket.Accept(w, r, websocket.AcceptOptions{})
708+
if err != nil {
709+
b.Logf("server handshake failed: %+v", err)
710+
return
711+
}
712+
if echo {
713+
echoLoop(r.Context(), c)
714+
} else {
715+
discardLoop(r.Context(), c)
716+
}
717+
}))
718+
defer closeFn()
719+
720+
wsURL := strings.Replace(s.URL, "http", "ws", 1)
721+
722+
ctx, cancel := context.WithTimeout(context.Background(), time.Minute*5)
723+
defer cancel()
724+
725+
c, _, err := websocket.Dial(ctx, wsURL, websocket.DialOptions{})
726+
if err != nil {
727+
b.Fatalf("failed to dial: %v", err)
709728
}
729+
defer c.Close(websocket.StatusInternalError, "")
710730

711-
b.Run(name, func(b *testing.B) {
712-
s, closeFn := testServer(b, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
713-
c, err := websocket.Accept(w, r, websocket.AcceptOptions{})
731+
msg := []byte(strings.Repeat("2", size))
732+
buf := make([]byte, len(msg))
733+
b.SetBytes(int64(len(msg)))
734+
b.ReportAllocs()
735+
b.ResetTimer()
736+
for i := 0; i < b.N; i++ {
737+
if stream {
738+
w, err := c.Writer(ctx, websocket.MessageText)
714739
if err != nil {
715-
b.Logf("server handshake failed: %+v", err)
716-
return
740+
b.Fatal(err)
717741
}
718-
if echo {
719-
echoLoop(r.Context(), c)
720-
} else {
721-
discardLoop(r.Context(), c)
742+
743+
_, err = w.Write(msg)
744+
if err != nil {
745+
b.Fatal(err)
722746
}
723-
}))
724-
defer closeFn()
725747

726-
wsURL := strings.Replace(s.URL, "http", "ws", 1)
748+
err = w.Close()
749+
if err != nil {
750+
b.Fatal(err)
751+
}
752+
} else {
753+
err = c.Write(ctx, websocket.MessageText, msg)
754+
if err != nil {
755+
b.Fatal(err)
756+
}
757+
}
727758

728-
ctx, cancel := context.WithTimeout(context.Background(), time.Minute*5)
729-
defer cancel()
759+
if echo {
760+
_, r, err := c.Reader(ctx)
761+
if err != nil {
762+
b.Fatal(err)
763+
}
730764

731-
c, _, err := websocket.Dial(ctx, wsURL, websocket.DialOptions{})
732-
if err != nil {
733-
b.Fatalf("failed to dial: %v", err)
765+
_, err = io.ReadFull(r, buf)
766+
if err != nil {
767+
b.Fatal(err)
768+
}
734769
}
735-
defer c.Close(websocket.StatusInternalError, "")
770+
}
771+
b.StopTimer()
736772

737-
sizes := []int{
738-
2,
739-
512,
740-
4096,
741-
16384,
742-
}
773+
c.Close(websocket.StatusNormalClosure, "")
774+
}
743775

776+
func BenchmarkConn(b *testing.B) {
777+
sizes := []int{
778+
2,
779+
32,
780+
512,
781+
4096,
782+
16384,
783+
}
784+
785+
b.Run("write", func(b *testing.B) {
744786
for _, size := range sizes {
745-
msg := []byte(strings.Repeat("2", size))
746-
buf := make([]byte, len(msg))
747787
b.Run(strconv.Itoa(size), func(b *testing.B) {
748-
b.SetBytes(int64(len(msg)))
749-
b.ReportAllocs()
750-
for i := 0; i < b.N; i++ {
751-
if stream {
752-
w, err := c.Writer(ctx, websocket.MessageText)
753-
if err != nil {
754-
b.Fatal(err)
755-
}
756-
757-
_, err = w.Write(msg)
758-
if err != nil {
759-
b.Fatal(err)
760-
}
761-
762-
err = w.Close()
763-
if err != nil {
764-
b.Fatal(err)
765-
}
766-
} else {
767-
err = c.Write(ctx, websocket.MessageText, msg)
768-
if err != nil {
769-
b.Fatal(err)
770-
}
771-
}
772-
773-
if echo {
774-
_, r, err := c.Reader(ctx)
775-
if err != nil {
776-
b.Fatal(err)
777-
}
778-
779-
_, err = io.ReadFull(r, buf)
780-
if err != nil {
781-
b.Fatal(err)
782-
}
783-
}
784-
}
788+
b.Run("stream", func(b *testing.B) {
789+
benchConn(b, false, true, size)
790+
})
791+
b.Run("buffer", func(b *testing.B) {
792+
benchConn(b, false, false, size)
793+
})
785794
})
786795
}
787-
788-
c.Close(websocket.StatusNormalClosure, "")
789796
})
790-
}
791797

792-
func BenchmarkConn(b *testing.B) {
793-
b.Run("write", func(b *testing.B) {
794-
benchConn(b, false, false)
795-
benchConn(b, false, true)
796-
})
797798
b.Run("echo", func(b *testing.B) {
798-
benchConn(b, true, true)
799+
for _, size := range sizes {
800+
b.Run(strconv.Itoa(size), func(b *testing.B) {
801+
benchConn(b, true, true, size)
802+
})
803+
}
799804
})
800805
}

0 commit comments

Comments
 (0)