gopkg.in/go-mangos/mangos.v1@v1.4.0/test/benchmark_test.go (about) 1 // Copyright 2018 The Mangos Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use file except in compliance with the License. 5 // You may obtain a copy of the license at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package test 16 17 import ( 18 "strings" 19 "testing" 20 "time" 21 22 "nanomsg.org/go-mangos" 23 "nanomsg.org/go-mangos/protocol/pair" 24 "nanomsg.org/go-mangos/protocol/rep" 25 "nanomsg.org/go-mangos/protocol/req" 26 "nanomsg.org/go-mangos/transport/all" 27 ) 28 29 func benchmarkReq(t *testing.B, url string, size int) { 30 31 srvopts := make(map[string]interface{}) 32 cliopts := make(map[string]interface{}) 33 34 if strings.HasPrefix(url, "wss://") || strings.HasPrefix(url, "tls+tcp://") { 35 srvopts[mangos.OptionTLSConfig] = srvCfg 36 cliopts[mangos.OptionTLSConfig] = cliCfg 37 } 38 srvrdy := make(chan struct{}) 39 srvsock, err := rep.NewSocket() 40 if err != nil || srvsock == nil { 41 t.Errorf("Failed creating server socket: %v", err) 42 return 43 } 44 defer srvsock.Close() 45 46 all.AddTransports(srvsock) 47 48 clisock, err := req.NewSocket() 49 if err != nil || clisock == nil { 50 t.Errorf("Failed creating client socket: %v", err) 51 return 52 } 53 defer clisock.Close() 54 all.AddTransports(clisock) 55 56 go func() { 57 var err error 58 var msg *mangos.Message 59 60 if err = srvsock.ListenOptions(url, srvopts); err != nil { 61 t.Errorf("Server listen failed: %v", err) 62 return 63 } 64 65 close(srvrdy) 66 // echo server 67 68 for { 69 if msg, err = srvsock.RecvMsg(); err != nil { 70 return 71 } 72 if err = srvsock.SendMsg(msg); err != nil { 73 t.Errorf("Server send failed: %v", err) 74 return 75 } 76 } 77 78 }() 79 80 if err = clisock.DialOptions(url, cliopts); err != nil { 81 t.Errorf("Client dial failed: %v", err) 82 return 83 } 84 <-srvrdy 85 86 time.Sleep(time.Millisecond * 1000) 87 t.ResetTimer() 88 msg := make([]byte, size) 89 90 for i := 0; i < t.N; i++ { 91 if err = clisock.Send(msg); err != nil { 92 t.Errorf("Client send failed: %v", err) 93 return 94 } 95 if msg, err = clisock.Recv(); err != nil { 96 t.Errorf("Client receive failed: %v", err) 97 return 98 } 99 } 100 if size > 128 { 101 t.SetBytes(int64(size)) 102 } 103 t.StopTimer() 104 } 105 106 func benchmarkPair(t *testing.B, url string, size int) { 107 108 srvopts := make(map[string]interface{}) 109 cliopts := make(map[string]interface{}) 110 111 if strings.HasPrefix(url, "wss://") || strings.HasPrefix(url, "tls+tcp://") { 112 srvopts[mangos.OptionTLSConfig] = srvCfg 113 cliopts[mangos.OptionTLSConfig] = cliCfg 114 } 115 116 finish := make(chan struct{}) 117 ready := make(chan struct{}) 118 srvsock, err := pair.NewSocket() 119 if err != nil || srvsock == nil { 120 t.Errorf("Failed creating server socket: %v", err) 121 return 122 } 123 all.AddTransports(srvsock) 124 defer srvsock.Close() 125 126 clisock, err := pair.NewSocket() 127 if err != nil || clisock == nil { 128 t.Errorf("Failed creating client socket: %v", err) 129 return 130 } 131 all.AddTransports(clisock) 132 defer clisock.Close() 133 134 go func() { 135 var err error 136 var m *mangos.Message 137 138 if err = srvsock.ListenOptions(url, srvopts); err != nil { 139 t.Errorf("Server listen failed: %v", err) 140 return 141 } 142 close(ready) 143 for i := 0; i < t.N; i++ { 144 if m, err = srvsock.RecvMsg(); err != nil { 145 t.Errorf("Error receiving %d: %v", i, err) 146 return 147 } 148 m.Free() 149 } 150 close(finish) 151 152 }() 153 <-ready 154 155 if err = clisock.DialOptions(url, cliopts); err != nil { 156 t.Errorf("Client dial failed: %v", err) 157 return 158 } 159 160 time.Sleep(700 * time.Millisecond) 161 t.ResetTimer() 162 163 for i := 0; i < t.N; i++ { 164 msg := mangos.NewMessage(size) 165 if err = clisock.SendMsg(msg); err != nil { 166 t.Errorf("Client send failed: %v", err) 167 return 168 } 169 } 170 <-finish 171 t.StopTimer() 172 if size > 128 { 173 t.SetBytes(int64(size)) 174 } 175 } 176 177 var benchInpAddr = "inproc://benchmark_test" 178 var benchTCPAddr = "tcp://127.0.0.1:33833" 179 var benchIPCAddr = "ipc://benchmark_test_sock" 180 var benchTLSAddr = "tls+tcp://127.0.0.1:44844" 181 var benchWSAddr = "ws://127.0.0.1:55855/BENCHMARK" 182 var benchWSSAddr = "wss://127.0.0.1:55856/BENCHMARK" 183 184 func BenchmarkLatencyInp(t *testing.B) { 185 benchmarkReq(t, benchInpAddr, 0) 186 } 187 func BenchmarkLatencyIPC(t *testing.B) { 188 benchmarkReq(t, benchIPCAddr, 0) 189 } 190 func BenchmarkLatencyTCP(t *testing.B) { 191 benchmarkReq(t, benchTCPAddr, 0) 192 } 193 func BenchmarkLatencyTLS(t *testing.B) { 194 benchmarkReq(t, benchTLSAddr, 0) 195 } 196 func BenchmarkLatencyWS(t *testing.B) { 197 benchmarkReq(t, benchWSAddr, 0) 198 } 199 func BenchmarkLatencyWSS(t *testing.B) { 200 benchmarkReq(t, benchWSSAddr, 0) 201 } 202 203 func BenchmarkTPut4kInp(t *testing.B) { 204 benchmarkPair(t, benchInpAddr, 4096) 205 } 206 func BenchmarkTPut4kIPC(t *testing.B) { 207 benchmarkPair(t, benchIPCAddr, 4096) 208 } 209 func BenchmarkTPut4kTCP(t *testing.B) { 210 benchmarkPair(t, benchTCPAddr, 4096) 211 } 212 func BenchmarkTPut4kTLS(t *testing.B) { 213 benchmarkPair(t, benchTLSAddr, 4096) 214 } 215 func BenchmarkTPut4kWS(t *testing.B) { 216 benchmarkPair(t, benchWSAddr, 4096) 217 } 218 func BenchmarkTPut4kWSS(t *testing.B) { 219 benchmarkPair(t, benchWSSAddr, 4096) 220 } 221 222 func BenchmarkTPut64kInp(t *testing.B) { 223 benchmarkPair(t, benchInpAddr, 65536) 224 } 225 func BenchmarkTPut64kIPC(t *testing.B) { 226 benchmarkPair(t, benchIPCAddr, 65536) 227 } 228 func BenchmarkTPut64kTCP(t *testing.B) { 229 benchmarkPair(t, benchTCPAddr, 65536) 230 } 231 func BenchmarkTPut64kTLS(t *testing.B) { 232 benchmarkPair(t, benchTLSAddr, 65536) 233 } 234 func BenchmarkTPut64kWS(t *testing.B) { 235 benchmarkPair(t, benchWSAddr, 65536) 236 } 237 func BenchmarkTPut64kWSS(t *testing.B) { 238 benchmarkPair(t, benchWSSAddr, 65536) 239 }