nanjj.github.io/nanomsg/go-mangos@v0.0.0-20190306054226-055062f7f3e2/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  	"nanjj.github.io/nanomsg/go-mangos"
    23  	"nanjj.github.io/nanomsg/go-mangos/protocol/pair"
    24  	"nanjj.github.io/nanomsg/go-mangos/protocol/rep"
    25  	"nanjj.github.io/nanomsg/go-mangos/protocol/req"
    26  	"nanjj.github.io/nanomsg/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  }