bench_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. package yamux
  2. import (
  3. "io"
  4. "io/ioutil"
  5. "testing"
  6. )
  7. func BenchmarkPing(b *testing.B) {
  8. client, server := testClientServer()
  9. defer func() {
  10. client.Close()
  11. server.Close()
  12. }()
  13. b.ReportAllocs()
  14. b.ResetTimer()
  15. for i := 0; i < b.N; i++ {
  16. rtt, err := client.Ping()
  17. if err != nil {
  18. b.Fatalf("err: %v", err)
  19. }
  20. if rtt == 0 {
  21. b.Fatalf("bad: %v", rtt)
  22. }
  23. }
  24. }
  25. func BenchmarkAccept(b *testing.B) {
  26. client, server := testClientServer()
  27. defer func() {
  28. client.Close()
  29. server.Close()
  30. }()
  31. doneCh := make(chan struct{})
  32. b.ReportAllocs()
  33. b.ResetTimer()
  34. go func() {
  35. defer close(doneCh)
  36. for i := 0; i < b.N; i++ {
  37. stream, err := server.AcceptStream()
  38. if err != nil {
  39. return
  40. }
  41. stream.Close()
  42. }
  43. }()
  44. for i := 0; i < b.N; i++ {
  45. stream, err := client.Open()
  46. if err != nil {
  47. b.Fatalf("err: %v", err)
  48. }
  49. stream.Close()
  50. }
  51. <-doneCh
  52. }
  53. func BenchmarkSendRecv32(b *testing.B) {
  54. const payloadSize = 32
  55. benchmarkSendRecv(b, payloadSize, payloadSize)
  56. }
  57. func BenchmarkSendRecv64(b *testing.B) {
  58. const payloadSize = 64
  59. benchmarkSendRecv(b, payloadSize, payloadSize)
  60. }
  61. func BenchmarkSendRecv128(b *testing.B) {
  62. const payloadSize = 128
  63. benchmarkSendRecv(b, payloadSize, payloadSize)
  64. }
  65. func BenchmarkSendRecv256(b *testing.B) {
  66. const payloadSize = 256
  67. benchmarkSendRecv(b, payloadSize, payloadSize)
  68. }
  69. func BenchmarkSendRecv512(b *testing.B) {
  70. const payloadSize = 512
  71. benchmarkSendRecv(b, payloadSize, payloadSize)
  72. }
  73. func BenchmarkSendRecv1024(b *testing.B) {
  74. const payloadSize = 1024
  75. benchmarkSendRecv(b, payloadSize, payloadSize)
  76. }
  77. func BenchmarkSendRecv2048(b *testing.B) {
  78. const payloadSize = 2048
  79. benchmarkSendRecv(b, payloadSize, payloadSize)
  80. }
  81. func BenchmarkSendRecv4096(b *testing.B) {
  82. const payloadSize = 4096
  83. benchmarkSendRecv(b, payloadSize, payloadSize)
  84. }
  85. func BenchmarkSendRecvLarge(b *testing.B) {
  86. const sendSize = 512 * 1024 * 1024 //512 MB
  87. const recvSize = 4 * 1024 //4 KB
  88. benchmarkSendRecv(b, sendSize, recvSize)
  89. }
  90. func benchmarkSendRecv(b *testing.B, sendSize, recvSize int) {
  91. client, server := testClientServer()
  92. defer func() {
  93. client.Close()
  94. server.Close()
  95. }()
  96. sendBuf := make([]byte, sendSize)
  97. recvBuf := make([]byte, recvSize)
  98. doneCh := make(chan struct{})
  99. b.SetBytes(int64(sendSize))
  100. b.ReportAllocs()
  101. b.ResetTimer()
  102. go func() {
  103. defer close(doneCh)
  104. stream, err := server.AcceptStream()
  105. if err != nil {
  106. return
  107. }
  108. defer stream.Close()
  109. switch {
  110. case sendSize == recvSize:
  111. for i := 0; i < b.N; i++ {
  112. if _, err := stream.Read(recvBuf); err != nil {
  113. b.Fatalf("err: %v", err)
  114. }
  115. }
  116. case recvSize > sendSize:
  117. b.Fatalf("bad test case; recvSize was: %d and sendSize was: %d, but recvSize must be <= sendSize!", recvSize, sendSize)
  118. default:
  119. chunks := sendSize / recvSize
  120. for i := 0; i < b.N; i++ {
  121. for j := 0; j < chunks; j++ {
  122. if _, err := stream.Read(recvBuf); err != nil {
  123. b.Fatalf("err: %v", err)
  124. }
  125. }
  126. }
  127. }
  128. }()
  129. stream, err := client.Open()
  130. if err != nil {
  131. b.Fatalf("err: %v", err)
  132. }
  133. defer stream.Close()
  134. for i := 0; i < b.N; i++ {
  135. if _, err := stream.Write(sendBuf); err != nil {
  136. b.Fatalf("err: %v", err)
  137. }
  138. }
  139. <-doneCh
  140. }
  141. func BenchmarkSendRecvParallel32(b *testing.B) {
  142. const payloadSize = 32
  143. benchmarkSendRecvParallel(b, payloadSize)
  144. }
  145. func BenchmarkSendRecvParallel64(b *testing.B) {
  146. const payloadSize = 64
  147. benchmarkSendRecvParallel(b, payloadSize)
  148. }
  149. func BenchmarkSendRecvParallel128(b *testing.B) {
  150. const payloadSize = 128
  151. benchmarkSendRecvParallel(b, payloadSize)
  152. }
  153. func BenchmarkSendRecvParallel256(b *testing.B) {
  154. const payloadSize = 256
  155. benchmarkSendRecvParallel(b, payloadSize)
  156. }
  157. func BenchmarkSendRecvParallel512(b *testing.B) {
  158. const payloadSize = 512
  159. benchmarkSendRecvParallel(b, payloadSize)
  160. }
  161. func BenchmarkSendRecvParallel1024(b *testing.B) {
  162. const payloadSize = 1024
  163. benchmarkSendRecvParallel(b, payloadSize)
  164. }
  165. func BenchmarkSendRecvParallel2048(b *testing.B) {
  166. const payloadSize = 2048
  167. benchmarkSendRecvParallel(b, payloadSize)
  168. }
  169. func BenchmarkSendRecvParallel4096(b *testing.B) {
  170. const payloadSize = 4096
  171. benchmarkSendRecvParallel(b, payloadSize)
  172. }
  173. func benchmarkSendRecvParallel(b *testing.B, sendSize int) {
  174. client, server := testClientServer()
  175. defer func() {
  176. client.Close()
  177. server.Close()
  178. }()
  179. sendBuf := make([]byte, sendSize)
  180. discarder := ioutil.Discard.(io.ReaderFrom)
  181. b.SetBytes(int64(sendSize))
  182. b.ReportAllocs()
  183. b.ResetTimer()
  184. b.RunParallel(func(pb *testing.PB) {
  185. doneCh := make(chan struct{})
  186. go func() {
  187. defer close(doneCh)
  188. stream, err := server.AcceptStream()
  189. if err != nil {
  190. return
  191. }
  192. defer stream.Close()
  193. if _, err := discarder.ReadFrom(stream); err != nil {
  194. b.Fatalf("err: %v", err)
  195. }
  196. }()
  197. stream, err := client.Open()
  198. if err != nil {
  199. b.Fatalf("err: %v", err)
  200. }
  201. for pb.Next() {
  202. if _, err := stream.Write(sendBuf); err != nil {
  203. b.Fatalf("err: %v", err)
  204. }
  205. }
  206. stream.Close()
  207. <-doneCh
  208. })
  209. }