99//!
1010//! Every implementation tests the same shapes for fair comparison:
1111//!
12- //! | Workload | u64 | msg48 | msg64 | inline | copy | rtrb | crossbeam |
13- //! |---------------|-----|-------|-------|--------|------|------|-----------|
14- //! | single | x | x | x | x | x | x | x |
15- //! | burst_100 | x | x | x | x | x | x | x |
16- //! | burst_1000 | x | x | x | x | x | x | x |
17- //! | batch_100 | x | x | | | x | | |
18- //! | batch_1000 | x | x | | | x | | |
19- //! | full_drain | x | | | x | | | |
12+ //! | Workload | u64 | msg48 | msg64 | inline | copy | rtrb | crossbeam | rigtorp |
13+ //! |---------------|-----|-------|-------|--------|------|------|-----------|---------|
14+ //! | single | x | x | x | x | x | x | x | x |
15+ //! | burst_100 | x | x | x | x | x | x | x | x |
16+ //! | burst_1000 | x | x | x | x | x | x | x | x |
17+ //! | batch_100 | x | x | | | x | | | |
18+ //! | batch_1000 | x | x | | | x | | | |
19+ //! | full_drain | x | | | x | | | | |
2020
2121use std:: hint:: black_box;
2222
@@ -743,6 +743,196 @@ fn bench_crossbeam_burst_1000(descs: &mut Vec<BenchDesc>, c: &mut MantisC) {
743743#[ cfg( not( feature = "bench-contenders" ) ) ]
744744fn bench_contenders ( _descs : & mut Vec < BenchDesc > , _c : & mut MantisC ) { }
745745
746+ // ---------------------------------------------------------------------------
747+ // C++ contenders (behind feature flag)
748+ // ---------------------------------------------------------------------------
749+
750+ #[ cfg( feature = "bench-contenders-cpp" ) ]
751+ fn bench_cpp_contenders ( descs : & mut Vec < BenchDesc > , c : & mut MantisC ) {
752+ bench_rigtorp_single ( descs, c) ;
753+ bench_rigtorp_burst ( descs, c) ;
754+ }
755+
756+ #[ cfg( feature = "bench-contenders-cpp" ) ]
757+ fn bench_rigtorp_single ( descs : & mut Vec < BenchDesc > , c : & mut MantisC ) {
758+ use mantis_bench:: rigtorp_ffi:: { RigtorpMsg48 , RigtorpMsg64 , RigtorpU64 } ;
759+
760+ descs. push ( run_bench (
761+ c,
762+ "spsc/rigtorp/single_item/u64" ,
763+ "u64" ,
764+ 1024 ,
765+ |b| {
766+ let mut q = RigtorpU64 :: new ( 1024 ) ;
767+ b. iter ( || {
768+ let _ = q. try_push ( black_box ( 42u64 ) ) ;
769+ let _ = black_box ( q. try_pop ( ) ) ;
770+ } ) ;
771+ } ,
772+ ) ) ;
773+
774+ descs. push ( run_bench (
775+ c,
776+ "spsc/rigtorp/single_item/msg48" ,
777+ "Message48" ,
778+ 1024 ,
779+ |b| {
780+ let mut q = RigtorpMsg48 :: new ( 1024 ) ;
781+ let msg = make_msg48 ( 1 ) ;
782+ b. iter ( || {
783+ let _ = q. try_push ( black_box ( & msg) ) ;
784+ let _ = black_box ( q. try_pop ( ) ) ;
785+ } ) ;
786+ } ,
787+ ) ) ;
788+
789+ descs. push ( run_bench (
790+ c,
791+ "spsc/rigtorp/single_item/msg64" ,
792+ "Message64" ,
793+ 1024 ,
794+ |b| {
795+ let mut q = RigtorpMsg64 :: new ( 1024 ) ;
796+ let msg = make_msg64 ( 1 ) ;
797+ b. iter ( || {
798+ let _ = q. try_push ( black_box ( & msg) ) ;
799+ let _ = black_box ( q. try_pop ( ) ) ;
800+ } ) ;
801+ } ,
802+ ) ) ;
803+ }
804+
805+ #[ cfg( feature = "bench-contenders-cpp" ) ]
806+ fn bench_rigtorp_burst ( descs : & mut Vec < BenchDesc > , c : & mut MantisC ) {
807+ bench_rigtorp_burst_100 ( descs, c) ;
808+ bench_rigtorp_burst_1000 ( descs, c) ;
809+ }
810+
811+ #[ cfg( feature = "bench-contenders-cpp" ) ]
812+ fn bench_rigtorp_burst_100 ( descs : & mut Vec < BenchDesc > , c : & mut MantisC ) {
813+ use mantis_bench:: rigtorp_ffi:: { RigtorpMsg48 , RigtorpMsg64 , RigtorpU64 } ;
814+
815+ descs. push ( run_bench (
816+ c,
817+ "spsc/rigtorp/burst_100/u64" ,
818+ "u64" ,
819+ 1024 ,
820+ |b| {
821+ let mut q = RigtorpU64 :: new ( 1024 ) ;
822+ b. iter ( || {
823+ for i in 0 ..100u64 {
824+ let _ = q. try_push ( black_box ( i) ) ;
825+ }
826+ for _ in 0 ..100 {
827+ let _ = black_box ( q. try_pop ( ) ) ;
828+ }
829+ } ) ;
830+ } ,
831+ ) ) ;
832+
833+ descs. push ( run_bench (
834+ c,
835+ "spsc/rigtorp/burst_100/msg48" ,
836+ "Message48" ,
837+ 1024 ,
838+ |b| {
839+ let mut q = RigtorpMsg48 :: new ( 1024 ) ;
840+ let msgs: Vec < Message48 > = ( 0 ..100 ) . map ( make_msg48) . collect ( ) ;
841+ b. iter ( || {
842+ for msg in & msgs {
843+ let _ = q. try_push ( black_box ( msg) ) ;
844+ }
845+ for _ in 0 ..100 {
846+ let _ = black_box ( q. try_pop ( ) ) ;
847+ }
848+ } ) ;
849+ } ,
850+ ) ) ;
851+
852+ descs. push ( run_bench (
853+ c,
854+ "spsc/rigtorp/burst_100/msg64" ,
855+ "Message64" ,
856+ 1024 ,
857+ |b| {
858+ let mut q = RigtorpMsg64 :: new ( 1024 ) ;
859+ let msgs: Vec < Message64 > = ( 0 ..100 ) . map ( make_msg64) . collect ( ) ;
860+ b. iter ( || {
861+ for msg in & msgs {
862+ let _ = q. try_push ( black_box ( msg) ) ;
863+ }
864+ for _ in 0 ..100 {
865+ let _ = black_box ( q. try_pop ( ) ) ;
866+ }
867+ } ) ;
868+ } ,
869+ ) ) ;
870+ }
871+
872+ #[ cfg( feature = "bench-contenders-cpp" ) ]
873+ fn bench_rigtorp_burst_1000 ( descs : & mut Vec < BenchDesc > , c : & mut MantisC ) {
874+ use mantis_bench:: rigtorp_ffi:: { RigtorpMsg48 , RigtorpMsg64 , RigtorpU64 } ;
875+
876+ descs. push ( run_bench (
877+ c,
878+ "spsc/rigtorp/burst_1000/u64" ,
879+ "u64" ,
880+ 2048 ,
881+ |b| {
882+ let mut q = RigtorpU64 :: new ( 2048 ) ;
883+ b. iter ( || {
884+ for i in 0 ..1000u64 {
885+ let _ = q. try_push ( black_box ( i) ) ;
886+ }
887+ for _ in 0 ..1000 {
888+ let _ = black_box ( q. try_pop ( ) ) ;
889+ }
890+ } ) ;
891+ } ,
892+ ) ) ;
893+
894+ descs. push ( run_bench (
895+ c,
896+ "spsc/rigtorp/burst_1000/msg48" ,
897+ "Message48" ,
898+ 2048 ,
899+ |b| {
900+ let mut q = RigtorpMsg48 :: new ( 2048 ) ;
901+ let msgs: Vec < Message48 > = ( 0 ..1000 ) . map ( make_msg48) . collect ( ) ;
902+ b. iter ( || {
903+ for msg in & msgs {
904+ let _ = q. try_push ( black_box ( msg) ) ;
905+ }
906+ for _ in 0 ..1000 {
907+ let _ = black_box ( q. try_pop ( ) ) ;
908+ }
909+ } ) ;
910+ } ,
911+ ) ) ;
912+
913+ descs. push ( run_bench (
914+ c,
915+ "spsc/rigtorp/burst_1000/msg64" ,
916+ "Message64" ,
917+ 2048 ,
918+ |b| {
919+ let mut q = RigtorpMsg64 :: new ( 2048 ) ;
920+ let msgs: Vec < Message64 > = ( 0 ..1000 ) . map ( make_msg64) . collect ( ) ;
921+ b. iter ( || {
922+ for msg in & msgs {
923+ let _ = q. try_push ( black_box ( msg) ) ;
924+ }
925+ for _ in 0 ..1000 {
926+ let _ = black_box ( q. try_pop ( ) ) ;
927+ }
928+ } ) ;
929+ } ,
930+ ) ) ;
931+ }
932+
933+ #[ cfg( not( feature = "bench-contenders-cpp" ) ) ]
934+ fn bench_cpp_contenders ( _descs : & mut Vec < BenchDesc > , _c : & mut MantisC ) { }
935+
746936// ---------------------------------------------------------------------------
747937// Unified entry point
748938// ---------------------------------------------------------------------------
@@ -753,6 +943,7 @@ fn bench_spsc(c: &mut MantisC) {
753943 bench_inline ( & mut descs, c) ;
754944 bench_copy ( & mut descs, c) ;
755945 bench_contenders ( & mut descs, c) ;
946+ bench_cpp_contenders ( & mut descs, c) ;
756947
757948 let mut features = Vec :: new ( ) ;
758949 if cfg ! ( feature = "asm" ) {
@@ -764,6 +955,9 @@ fn bench_spsc(c: &mut MantisC) {
764955 if cfg ! ( feature = "bench-contenders" ) {
765956 features. push ( "bench-contenders" . to_owned ( ) ) ;
766957 }
958+ if cfg ! ( feature = "bench-contenders-cpp" ) {
959+ features. push ( "bench-contenders-cpp" . to_owned ( ) ) ;
960+ }
767961 export_report ( & descs, "SPSC Ring (all)" , "spsc" , features) ;
768962}
769963
0 commit comments