@@ -702,99 +702,104 @@ func checkWSTestIndex(t *testing.T, path string) {
702
702
}
703
703
}
704
704
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 )
709
728
}
729
+ defer c .Close (websocket .StatusInternalError , "" )
710
730
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 )
714
739
if err != nil {
715
- b .Logf ("server handshake failed: %+v" , err )
716
- return
740
+ b .Fatal (err )
717
741
}
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 )
722
746
}
723
- }))
724
- defer closeFn ()
725
747
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
+ }
727
758
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
+ }
730
764
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
+ }
734
769
}
735
- defer c .Close (websocket .StatusInternalError , "" )
770
+ }
771
+ b .StopTimer ()
736
772
737
- sizes := []int {
738
- 2 ,
739
- 512 ,
740
- 4096 ,
741
- 16384 ,
742
- }
773
+ c .Close (websocket .StatusNormalClosure , "" )
774
+ }
743
775
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 ) {
744
786
for _ , size := range sizes {
745
- msg := []byte (strings .Repeat ("2" , size ))
746
- buf := make ([]byte , len (msg ))
747
787
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
+ })
785
794
})
786
795
}
787
-
788
- c .Close (websocket .StatusNormalClosure , "" )
789
796
})
790
- }
791
797
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
- })
797
798
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
+ }
799
804
})
800
805
}
0 commit comments