@@ -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