@@ -282,3 +282,305 @@ pub fn iter_10k(b: &mut Bencher) {
282282pub fn iter_1m ( b : & mut Bencher ) {
283283 bench_iter ( b, 1_000 , 1_000_000 ) ;
284284}
285+
286+ const FAT : usize = 256 ;
287+
288+ // The returned map has small keys and values.
289+ // Benchmarks on it have a counterpart in set.rs with the same keys and no values at all.
290+ fn slim_map ( n : usize ) -> BTreeMap < usize , usize > {
291+ ( 0 ..n) . map ( |i| ( i, i) ) . collect :: < BTreeMap < _ , _ > > ( )
292+ }
293+
294+ // The returned map has small keys and large values.
295+ fn fat_val_map ( n : usize ) -> BTreeMap < usize , [ usize ; FAT ] > {
296+ ( 0 ..n) . map ( |i| ( i, [ i; FAT ] ) ) . collect :: < BTreeMap < _ , _ > > ( )
297+ }
298+
299+ // The returned map has large keys and values.
300+ fn fat_map ( n : usize ) -> BTreeMap < [ usize ; FAT ] , [ usize ; FAT ] > {
301+ ( 0 ..n) . map ( |i| ( [ i; FAT ] , [ i; FAT ] ) ) . collect :: < BTreeMap < _ , _ > > ( )
302+ }
303+
304+ #[ bench]
305+ pub fn clone_slim_100 ( b : & mut Bencher ) {
306+ let src = slim_map ( 100 ) ;
307+ b. iter ( || src. clone ( ) )
308+ }
309+
310+ #[ bench]
311+ pub fn clone_slim_100_and_clear ( b : & mut Bencher ) {
312+ let src = slim_map ( 100 ) ;
313+ b. iter ( || src. clone ( ) . clear ( ) )
314+ }
315+
316+ #[ bench]
317+ pub fn clone_slim_100_and_drain_all ( b : & mut Bencher ) {
318+ let src = slim_map ( 100 ) ;
319+ b. iter ( || src. clone ( ) . drain_filter ( |_, _| true ) . count ( ) )
320+ }
321+
322+ #[ bench]
323+ pub fn clone_slim_100_and_drain_half ( b : & mut Bencher ) {
324+ let src = slim_map ( 100 ) ;
325+ b. iter ( || {
326+ let mut map = src. clone ( ) ;
327+ assert_eq ! ( map. drain_filter( |i, _| i % 2 == 0 ) . count( ) , 100 / 2 ) ;
328+ assert_eq ! ( map. len( ) , 100 / 2 ) ;
329+ } )
330+ }
331+
332+ #[ bench]
333+ pub fn clone_slim_100_and_into_iter ( b : & mut Bencher ) {
334+ let src = slim_map ( 100 ) ;
335+ b. iter ( || src. clone ( ) . into_iter ( ) . count ( ) )
336+ }
337+
338+ #[ bench]
339+ pub fn clone_slim_100_and_pop_all ( b : & mut Bencher ) {
340+ let src = slim_map ( 100 ) ;
341+ b. iter ( || {
342+ let mut map = src. clone ( ) ;
343+ while map. pop_first ( ) . is_some ( ) { }
344+ map
345+ } ) ;
346+ }
347+
348+ #[ bench]
349+ pub fn clone_slim_100_and_remove_all ( b : & mut Bencher ) {
350+ let src = slim_map ( 100 ) ;
351+ b. iter ( || {
352+ let mut map = src. clone ( ) ;
353+ while let Some ( elt) = map. iter ( ) . map ( |( & i, _) | i) . next ( ) {
354+ let v = map. remove ( & elt) ;
355+ debug_assert ! ( v. is_some( ) ) ;
356+ }
357+ map
358+ } ) ;
359+ }
360+
361+ #[ bench]
362+ pub fn clone_slim_100_and_remove_half ( b : & mut Bencher ) {
363+ let src = slim_map ( 100 ) ;
364+ b. iter ( || {
365+ let mut map = src. clone ( ) ;
366+ for i in ( 0 ..100 ) . step_by ( 2 ) {
367+ let v = map. remove ( & i) ;
368+ debug_assert ! ( v. is_some( ) ) ;
369+ }
370+ assert_eq ! ( map. len( ) , 100 / 2 ) ;
371+ map
372+ } )
373+ }
374+
375+ #[ bench]
376+ pub fn clone_slim_10k ( b : & mut Bencher ) {
377+ let src = slim_map ( 10_000 ) ;
378+ b. iter ( || src. clone ( ) )
379+ }
380+
381+ #[ bench]
382+ pub fn clone_slim_10k_and_clear ( b : & mut Bencher ) {
383+ let src = slim_map ( 10_000 ) ;
384+ b. iter ( || src. clone ( ) . clear ( ) )
385+ }
386+
387+ #[ bench]
388+ pub fn clone_slim_10k_and_drain_all ( b : & mut Bencher ) {
389+ let src = slim_map ( 10_000 ) ;
390+ b. iter ( || src. clone ( ) . drain_filter ( |_, _| true ) . count ( ) )
391+ }
392+
393+ #[ bench]
394+ pub fn clone_slim_10k_and_drain_half ( b : & mut Bencher ) {
395+ let src = slim_map ( 10_000 ) ;
396+ b. iter ( || {
397+ let mut map = src. clone ( ) ;
398+ assert_eq ! ( map. drain_filter( |i, _| i % 2 == 0 ) . count( ) , 10_000 / 2 ) ;
399+ assert_eq ! ( map. len( ) , 10_000 / 2 ) ;
400+ } )
401+ }
402+
403+ #[ bench]
404+ pub fn clone_slim_10k_and_into_iter ( b : & mut Bencher ) {
405+ let src = slim_map ( 10_000 ) ;
406+ b. iter ( || src. clone ( ) . into_iter ( ) . count ( ) )
407+ }
408+
409+ #[ bench]
410+ pub fn clone_slim_10k_and_pop_all ( b : & mut Bencher ) {
411+ let src = slim_map ( 10_000 ) ;
412+ b. iter ( || {
413+ let mut map = src. clone ( ) ;
414+ while map. pop_first ( ) . is_some ( ) { }
415+ map
416+ } ) ;
417+ }
418+
419+ #[ bench]
420+ pub fn clone_slim_10k_and_remove_all ( b : & mut Bencher ) {
421+ let src = slim_map ( 10_000 ) ;
422+ b. iter ( || {
423+ let mut map = src. clone ( ) ;
424+ while let Some ( elt) = map. iter ( ) . map ( |( & i, _) | i) . next ( ) {
425+ let v = map. remove ( & elt) ;
426+ debug_assert ! ( v. is_some( ) ) ;
427+ }
428+ map
429+ } ) ;
430+ }
431+
432+ #[ bench]
433+ pub fn clone_slim_10k_and_remove_half ( b : & mut Bencher ) {
434+ let src = slim_map ( 10_000 ) ;
435+ b. iter ( || {
436+ let mut map = src. clone ( ) ;
437+ for i in ( 0 ..10_000 ) . step_by ( 2 ) {
438+ let v = map. remove ( & i) ;
439+ debug_assert ! ( v. is_some( ) ) ;
440+ }
441+ assert_eq ! ( map. len( ) , 10_000 / 2 ) ;
442+ map
443+ } )
444+ }
445+
446+ #[ bench]
447+ pub fn clone_fat_val_100 ( b : & mut Bencher ) {
448+ let src = fat_val_map ( 100 ) ;
449+ b. iter ( || src. clone ( ) )
450+ }
451+
452+ #[ bench]
453+ pub fn clone_fat_val_100_and_clear ( b : & mut Bencher ) {
454+ let src = fat_val_map ( 100 ) ;
455+ b. iter ( || src. clone ( ) . clear ( ) )
456+ }
457+
458+ #[ bench]
459+ pub fn clone_fat_val_100_and_drain_all ( b : & mut Bencher ) {
460+ let src = fat_val_map ( 100 ) ;
461+ b. iter ( || src. clone ( ) . drain_filter ( |_, _| true ) . count ( ) )
462+ }
463+
464+ #[ bench]
465+ pub fn clone_fat_val_100_and_drain_half ( b : & mut Bencher ) {
466+ let src = fat_val_map ( 100 ) ;
467+ b. iter ( || {
468+ let mut map = src. clone ( ) ;
469+ assert_eq ! ( map. drain_filter( |i, _| i % 2 == 0 ) . count( ) , 100 / 2 ) ;
470+ assert_eq ! ( map. len( ) , 100 / 2 ) ;
471+ } )
472+ }
473+
474+ #[ bench]
475+ pub fn clone_fat_val_100_and_into_iter ( b : & mut Bencher ) {
476+ let src = fat_val_map ( 100 ) ;
477+ b. iter ( || src. clone ( ) . into_iter ( ) . count ( ) )
478+ }
479+
480+ #[ bench]
481+ pub fn clone_fat_val_100_and_pop_all ( b : & mut Bencher ) {
482+ let src = fat_val_map ( 100 ) ;
483+ b. iter ( || {
484+ let mut map = src. clone ( ) ;
485+ while map. pop_first ( ) . is_some ( ) { }
486+ map
487+ } ) ;
488+ }
489+
490+ #[ bench]
491+ pub fn clone_fat_val_100_and_remove_all ( b : & mut Bencher ) {
492+ let src = fat_val_map ( 100 ) ;
493+ b. iter ( || {
494+ let mut map = src. clone ( ) ;
495+ while let Some ( elt) = map. iter ( ) . map ( |( & i, _) | i) . next ( ) {
496+ let v = map. remove ( & elt) ;
497+ debug_assert ! ( v. is_some( ) ) ;
498+ }
499+ map
500+ } ) ;
501+ }
502+
503+ #[ bench]
504+ pub fn clone_fat_val_100_and_remove_half ( b : & mut Bencher ) {
505+ let src = fat_val_map ( 100 ) ;
506+ b. iter ( || {
507+ let mut map = src. clone ( ) ;
508+ for i in ( 0 ..100 ) . step_by ( 2 ) {
509+ let v = map. remove ( & i) ;
510+ debug_assert ! ( v. is_some( ) ) ;
511+ }
512+ assert_eq ! ( map. len( ) , 100 / 2 ) ;
513+ map
514+ } )
515+ }
516+
517+ #[ bench]
518+ pub fn clone_fat_100 ( b : & mut Bencher ) {
519+ let src = fat_map ( 100 ) ;
520+ b. iter ( || src. clone ( ) )
521+ }
522+
523+ #[ bench]
524+ pub fn clone_fat_100_and_clear ( b : & mut Bencher ) {
525+ let src = fat_map ( 100 ) ;
526+ b. iter ( || src. clone ( ) . clear ( ) )
527+ }
528+
529+ #[ bench]
530+ pub fn clone_fat_100_and_drain_all ( b : & mut Bencher ) {
531+ let src = fat_map ( 100 ) ;
532+ b. iter ( || src. clone ( ) . drain_filter ( |_, _| true ) . count ( ) )
533+ }
534+
535+ #[ bench]
536+ pub fn clone_fat_100_and_drain_half ( b : & mut Bencher ) {
537+ let src = fat_map ( 100 ) ;
538+ b. iter ( || {
539+ let mut map = src. clone ( ) ;
540+ assert_eq ! ( map. drain_filter( |i, _| i[ 0 ] % 2 == 0 ) . count( ) , 100 / 2 ) ;
541+ assert_eq ! ( map. len( ) , 100 / 2 ) ;
542+ } )
543+ }
544+
545+ #[ bench]
546+ pub fn clone_fat_100_and_into_iter ( b : & mut Bencher ) {
547+ let src = fat_map ( 100 ) ;
548+ b. iter ( || src. clone ( ) . into_iter ( ) . count ( ) )
549+ }
550+
551+ #[ bench]
552+ pub fn clone_fat_100_and_pop_all ( b : & mut Bencher ) {
553+ let src = fat_map ( 100 ) ;
554+ b. iter ( || {
555+ let mut map = src. clone ( ) ;
556+ while map. pop_first ( ) . is_some ( ) { }
557+ map
558+ } ) ;
559+ }
560+
561+ #[ bench]
562+ pub fn clone_fat_100_and_remove_all ( b : & mut Bencher ) {
563+ let src = fat_map ( 100 ) ;
564+ b. iter ( || {
565+ let mut map = src. clone ( ) ;
566+ while let Some ( elt) = map. iter ( ) . map ( |( & i, _) | i) . next ( ) {
567+ let v = map. remove ( & elt) ;
568+ debug_assert ! ( v. is_some( ) ) ;
569+ }
570+ map
571+ } ) ;
572+ }
573+
574+ #[ bench]
575+ pub fn clone_fat_100_and_remove_half ( b : & mut Bencher ) {
576+ let src = fat_map ( 100 ) ;
577+ b. iter ( || {
578+ let mut map = src. clone ( ) ;
579+ for i in ( 0 ..100 ) . step_by ( 2 ) {
580+ let v = map. remove ( & [ i; FAT ] ) ;
581+ debug_assert ! ( v. is_some( ) ) ;
582+ }
583+ assert_eq ! ( map. len( ) , 100 / 2 ) ;
584+ map
585+ } )
586+ }
0 commit comments