@@ -64,6 +64,16 @@ fn http1_parallel_x10_req_10mb(b: &mut test::Bencher) {
64
64
. bench ( b)
65
65
}
66
66
67
+ #[ bench]
68
+ fn http1_parallel_x10_req_10kb_100_chunks ( b : & mut test:: Bencher ) {
69
+ let body = & [ b'x' ; 1024 * 10 ] ;
70
+ opts ( )
71
+ . parallel ( 10 )
72
+ . method ( Method :: POST )
73
+ . request_chunks ( body, 100 )
74
+ . bench ( b)
75
+ }
76
+
67
77
#[ bench]
68
78
fn http1_parallel_x10_res_1mb ( b : & mut test:: Bencher ) {
69
79
let body = & [ b'x' ; 1024 * 1024 * 1 ] ;
@@ -128,8 +138,21 @@ fn http2_parallel_x10_req_10mb(b: &mut test::Bencher) {
128
138
. parallel ( 10 )
129
139
. method ( Method :: POST )
130
140
. request_body ( body)
131
- //.http2_stream_window(HTTP2_MAX_WINDOW)
132
- //.http2_conn_window(HTTP2_MAX_WINDOW)
141
+ . http2_stream_window ( HTTP2_MAX_WINDOW )
142
+ . http2_conn_window ( HTTP2_MAX_WINDOW )
143
+ . bench ( b)
144
+ }
145
+
146
+ #[ bench]
147
+ fn http2_parallel_x10_req_10kb_100_chunks ( b : & mut test:: Bencher ) {
148
+ let body = & [ b'x' ; 1024 * 10 ] ;
149
+ opts ( )
150
+ . http2 ( )
151
+ . parallel ( 10 )
152
+ . method ( Method :: POST )
153
+ . request_chunks ( body, 100 )
154
+ . http2_stream_window ( HTTP2_MAX_WINDOW )
155
+ . http2_conn_window ( HTTP2_MAX_WINDOW )
133
156
. bench ( b)
134
157
}
135
158
@@ -166,6 +189,7 @@ struct Opts {
166
189
parallel_cnt : u32 ,
167
190
request_method : Method ,
168
191
request_body : Option < & ' static [ u8 ] > ,
192
+ request_chunks : usize ,
169
193
response_body : & ' static [ u8 ] ,
170
194
}
171
195
@@ -177,6 +201,7 @@ fn opts() -> Opts {
177
201
parallel_cnt : 1 ,
178
202
request_method : Method :: GET ,
179
203
request_body : None ,
204
+ request_chunks : 0 ,
180
205
response_body : b"Hello" ,
181
206
}
182
207
}
@@ -207,6 +232,13 @@ impl Opts {
207
232
self
208
233
}
209
234
235
+ fn request_chunks ( mut self , chunk : & ' static [ u8 ] , cnt : usize ) -> Self {
236
+ assert ! ( cnt > 0 ) ;
237
+ self . request_body = Some ( chunk) ;
238
+ self . request_chunks = cnt;
239
+ self
240
+ }
241
+
210
242
fn response_body ( mut self , body : & ' static [ u8 ] ) -> Self {
211
243
self . response_body = body;
212
244
self
@@ -222,8 +254,16 @@ impl Opts {
222
254
let _ = pretty_env_logger:: try_init ( ) ;
223
255
// Create a runtime of current thread.
224
256
let mut rt = Runtime :: new ( ) . unwrap ( ) ;
257
+ let exec = rt. handle ( ) ;
225
258
226
- b. bytes = self . response_body . len ( ) as u64 + self . request_body . map ( |b| b. len ( ) ) . unwrap_or ( 0 ) as u64 ;
259
+ let req_len = self . request_body . map ( |b| b. len ( ) ) . unwrap_or ( 0 ) as u64 ;
260
+ let req_len = if self . request_chunks > 0 {
261
+ req_len * self . request_chunks as u64
262
+ } else {
263
+ req_len
264
+ } ;
265
+ let bytes_per_iter = ( req_len + self . response_body . len ( ) as u64 ) * self . parallel_cnt as u64 ;
266
+ b. bytes = bytes_per_iter;
227
267
228
268
let addr = spawn_server ( & mut rt, & self ) ;
229
269
@@ -237,10 +277,23 @@ impl Opts {
237
277
let url: hyper:: Uri = format ! ( "http://{}/hello" , addr) . parse ( ) . unwrap ( ) ;
238
278
239
279
let make_request = || {
240
- let body = self
241
- . request_body
242
- . map ( Body :: from)
243
- . unwrap_or_else ( || Body :: empty ( ) ) ;
280
+ let chunk_cnt = self . request_chunks ;
281
+ let body = if chunk_cnt > 0 {
282
+
283
+ let ( mut tx, body) = Body :: channel ( ) ;
284
+ let chunk = self . request_body . expect ( "request_chunks means request_body" ) ;
285
+ exec. spawn ( async move {
286
+ for _ in 0 ..chunk_cnt {
287
+ tx. send_data ( chunk. into ( ) ) . await . expect ( "send_data" ) ;
288
+ }
289
+ } ) . expect ( "body tx spawn" ) ;
290
+ body
291
+ } else {
292
+ self
293
+ . request_body
294
+ . map ( Body :: from)
295
+ . unwrap_or_else ( || Body :: empty ( ) )
296
+ } ;
244
297
let mut req = Request :: new ( body) ;
245
298
* req. method_mut ( ) = self . request_method . clone ( ) ;
246
299
* req. uri_mut ( ) = url. clone ( ) ;
0 commit comments