@@ -146,12 +146,23 @@ fn bench_for_each_chain_ref_fold(b: &mut Bencher) {
146
146
/// Helper to benchmark `sum` for iterators taken by value which
147
147
/// can optimize `fold`, and by reference which cannot.
148
148
macro_rules! bench_sums {
149
- ( $bench_sum: ident, $bench_ref_sum: ident, $iter: expr) => {
149
+ ( $bench_sum: ident, $bench_sum_loop : ident , $ bench_ref_sum: ident, $iter: expr) => {
150
150
#[ bench]
151
151
fn $bench_sum( b: & mut Bencher ) {
152
152
b. iter( || -> i64 { $iter. map( black_box) . sum( ) } ) ;
153
153
}
154
154
155
+ #[ bench]
156
+ fn $bench_sum_loop( b: & mut Bencher ) {
157
+ b. iter( || -> i64 {
158
+ let mut acc = 0 ;
159
+ for i in $iter. map( black_box) {
160
+ acc += i;
161
+ }
162
+ acc
163
+ } ) ;
164
+ }
165
+
155
166
#[ bench]
156
167
fn $bench_ref_sum( b: & mut Bencher ) {
157
168
b. iter( || -> i64 { $iter. map( black_box) . by_ref( ) . sum( ) } ) ;
@@ -161,138 +172,161 @@ macro_rules! bench_sums {
161
172
162
173
bench_sums ! {
163
174
bench_flat_map_sum,
175
+ bench_flat_map_sum_loop,
164
176
bench_flat_map_ref_sum,
165
177
( 0i64 ..1000 ) . flat_map( |x| x..x+1000 )
166
178
}
167
179
168
180
bench_sums ! {
169
181
bench_flat_map_chain_sum,
182
+ bench_flat_map_chain_sum_loop,
170
183
bench_flat_map_chain_ref_sum,
171
184
( 0i64 ..1000000 ) . flat_map( |x| once( x) . chain( once( x) ) )
172
185
}
173
186
174
187
bench_sums ! {
175
188
bench_enumerate_sum,
189
+ bench_enumerate_sum_loop,
176
190
bench_enumerate_ref_sum,
177
191
( 0i64 ..1000000 ) . enumerate( ) . map( |( i, x) | x * i as i64 )
178
192
}
179
193
180
194
bench_sums ! {
181
195
bench_enumerate_chain_sum,
196
+ bench_enumerate_chain_sum_loop,
182
197
bench_enumerate_chain_ref_sum,
183
198
( 0i64 ..1000000 ) . chain( 0 ..1000000 ) . enumerate( ) . map( |( i, x) | x * i as i64 )
184
199
}
185
200
186
201
bench_sums ! {
187
202
bench_filter_sum,
203
+ bench_filter_sum_loop,
188
204
bench_filter_ref_sum,
189
205
( 0i64 ..1000000 ) . filter( |x| x % 3 == 0 )
190
206
}
191
207
192
208
bench_sums ! {
193
209
bench_filter_chain_sum,
210
+ bench_filter_chain_sum_loop,
194
211
bench_filter_chain_ref_sum,
195
212
( 0i64 ..1000000 ) . chain( 0 ..1000000 ) . filter( |x| x % 3 == 0 )
196
213
}
197
214
198
215
bench_sums ! {
199
216
bench_filter_map_sum,
217
+ bench_filter_map_sum_loop,
200
218
bench_filter_map_ref_sum,
201
219
( 0i64 ..1000000 ) . filter_map( |x| x. checked_mul( x) )
202
220
}
203
221
204
222
bench_sums ! {
205
223
bench_filter_map_chain_sum,
224
+ bench_filter_map_chain_sum_loop,
206
225
bench_filter_map_chain_ref_sum,
207
226
( 0i64 ..1000000 ) . chain( 0 ..1000000 ) . filter_map( |x| x. checked_mul( x) )
208
227
}
209
228
210
229
bench_sums ! {
211
230
bench_fuse_sum,
231
+ bench_fuse_sum_loop,
212
232
bench_fuse_ref_sum,
213
233
( 0i64 ..1000000 ) . fuse( )
214
234
}
215
235
216
236
bench_sums ! {
217
237
bench_fuse_chain_sum,
238
+ bench_fuse_chain_sum_loop,
218
239
bench_fuse_chain_ref_sum,
219
240
( 0i64 ..1000000 ) . chain( 0 ..1000000 ) . fuse( )
220
241
}
221
242
222
243
bench_sums ! {
223
244
bench_inspect_sum,
245
+ bench_inspect_sum_loop,
224
246
bench_inspect_ref_sum,
225
247
( 0i64 ..1000000 ) . inspect( |_| { } )
226
248
}
227
249
228
250
bench_sums ! {
229
251
bench_inspect_chain_sum,
252
+ bench_inspect_chain_sum_loop,
230
253
bench_inspect_chain_ref_sum,
231
254
( 0i64 ..1000000 ) . chain( 0 ..1000000 ) . inspect( |_| { } )
232
255
}
233
256
234
257
bench_sums ! {
235
258
bench_peekable_sum,
259
+ bench_peekable_sum_loop,
236
260
bench_peekable_ref_sum,
237
261
( 0i64 ..1000000 ) . peekable( )
238
262
}
239
263
240
264
bench_sums ! {
241
265
bench_peekable_chain_sum,
266
+ bench_peekable_chain_sum_loop,
242
267
bench_peekable_chain_ref_sum,
243
268
( 0i64 ..1000000 ) . chain( 0 ..1000000 ) . peekable( )
244
269
}
245
270
246
271
bench_sums ! {
247
272
bench_skip_sum,
273
+ bench_skip_sum_loop,
248
274
bench_skip_ref_sum,
249
275
( 0i64 ..1000000 ) . skip( 1000 )
250
276
}
251
277
252
278
bench_sums ! {
253
279
bench_skip_chain_sum,
280
+ bench_skip_chain_sum_loop,
254
281
bench_skip_chain_ref_sum,
255
282
( 0i64 ..1000000 ) . chain( 0 ..1000000 ) . skip( 1000 )
256
283
}
257
284
258
285
bench_sums ! {
259
286
bench_skip_while_sum,
287
+ bench_skip_while_sum_loop,
260
288
bench_skip_while_ref_sum,
261
289
( 0i64 ..1000000 ) . skip_while( |& x| x < 1000 )
262
290
}
263
291
264
292
bench_sums ! {
265
293
bench_skip_while_chain_sum,
294
+ bench_skip_while_chain_sum_loop,
266
295
bench_skip_while_chain_ref_sum,
267
296
( 0i64 ..1000000 ) . chain( 0 ..1000000 ) . skip_while( |& x| x < 1000 )
268
297
}
269
298
270
299
bench_sums ! {
271
300
bench_take_while_chain_sum,
301
+ bench_take_while_chain_sum_loop,
272
302
bench_take_while_chain_ref_sum,
273
303
( 0i64 ..1000000 ) . chain( 1000000 ..) . take_while( |& x| x < 1111111 )
274
304
}
275
305
276
306
bench_sums ! {
277
307
bench_cycle_take_sum,
308
+ bench_cycle_take_sum_loop,
278
309
bench_cycle_take_ref_sum,
279
310
( 0 ..10000 ) . cycle( ) . take( 1000000 )
280
311
}
281
312
282
313
bench_sums ! {
283
314
bench_cycle_skip_take_sum,
315
+ bench_cycle_skip_take_sum_loop,
284
316
bench_cycle_skip_take_ref_sum,
285
317
( 0 ..100000 ) . cycle( ) . skip( 1000000 ) . take( 1000000 )
286
318
}
287
319
288
320
bench_sums ! {
289
321
bench_cycle_take_skip_sum,
322
+ bench_cycle_take_skip_sum_loop,
290
323
bench_cycle_take_skip_ref_sum,
291
324
( 0 ..100000 ) . cycle( ) . take( 1000000 ) . skip( 100000 )
292
325
}
293
326
294
327
bench_sums ! {
295
328
bench_skip_cycle_skip_zip_add_sum,
329
+ bench_skip_cycle_skip_zip_add_sum_loop,
296
330
bench_skip_cycle_skip_zip_add_ref_sum,
297
331
( 0 ..100000 ) . skip( 100 ) . cycle( ) . skip( 100 )
298
332
. zip( ( 0 ..100000 ) . cycle( ) . skip( 10 ) )
@@ -368,6 +402,26 @@ fn bench_lt(b: &mut Bencher) {
368
402
b. iter ( || ( 0 ..100000 ) . map ( black_box) . lt ( ( 0 ..100000 ) . map ( black_box) ) )
369
403
}
370
404
405
+ #[ bench]
406
+ fn bench_desugar ( b : & mut Bencher ) {
407
+ let vec1: Vec < _ > = ( 0usize ..100000 ) . collect ( ) ;
408
+ let vec2 = black_box ( vec1. clone ( ) ) ;
409
+ b. iter ( || {
410
+ let iter = vec1
411
+ . iter ( )
412
+ . enumerate ( )
413
+ . map ( |( idx, e) | idx. wrapping_add ( * e) )
414
+ . zip ( vec2. iter ( ) )
415
+ . map ( |( a, b) | a. wrapping_add ( * b) )
416
+ . fuse ( ) ;
417
+ let mut acc = 0 ;
418
+ for i in iter {
419
+ acc += i;
420
+ }
421
+ acc
422
+ } )
423
+ }
424
+
371
425
#[ bench]
372
426
fn bench_trusted_random_access_adapters ( b : & mut Bencher ) {
373
427
let vec1: Vec < _ > = ( 0usize ..100000 ) . collect ( ) ;
0 commit comments