1- #![ no_coverage]
1+ #![ feature( coverage_attribute) ]
2+ #![ coverage( off) ]
23use criterion:: { black_box, criterion_group, criterion_main, Bencher , Criterion } ;
3- use ringbuffer:: { AllocRingBuffer , ConstGenericRingBuffer , RingBuffer } ;
4+ use ringbuffer:: { AllocRingBuffer , ConstGenericRingBuffer , RingBuffer , SetLen } ;
45
56fn benchmark_push < T : RingBuffer < i32 > , F : Fn ( ) -> T > ( b : & mut Bencher , new : F ) {
67 b. iter ( || {
@@ -63,6 +64,89 @@ fn benchmark_various<T: RingBuffer<i32>, F: Fn() -> T>(b: &mut Bencher, new: F)
6364 } )
6465}
6566
67+ fn benchmark_copy_to_slice_vs_extend < T : RingBuffer < i32 > , F : Fn ( ) -> T > (
68+ rb_size : usize ,
69+ rb_type : & str ,
70+ fn_name : & str ,
71+ c : & mut Criterion ,
72+ new : F ,
73+ ) {
74+ let mut group = c. benchmark_group ( format ! ( "{fn_name}({rb_type}, {rb_size})" ) ) ;
75+ let mut output = vec ! [ 0 ; rb_size] ;
76+ group. bench_function ( format ! ( "CopyTo({rb_type}; {rb_size})" ) , |b| {
77+ let mut rb = new ( ) ;
78+ rb. fill ( 9 ) ;
79+ // making sure the read/write pointers wrap around
80+ for _ in 0 ..rb_size / 2 {
81+ let _ = rb. dequeue ( ) ;
82+ let _ = rb. enqueue ( 9 ) ;
83+ }
84+ b. iter ( || {
85+ rb. copy_to_slice ( 0 , & mut output) ;
86+ assert_eq ! ( output[ output. len( ) / 2 ] , 9 ) ;
87+ assert_eq ! ( output. len( ) , rb_size) ;
88+ } )
89+ } ) ;
90+ let mut output: Vec < i32 > = Vec :: with_capacity ( rb_size) ;
91+ group. bench_function ( format ! ( "ExtendVec({rb_type}; {rb_size})" ) , |b| {
92+ let mut rb = new ( ) ;
93+ rb. fill ( 9 ) ;
94+ // making sure the read/write pointers wrap around
95+ for _ in 0 ..rb_size / 2 {
96+ let _ = rb. dequeue ( ) ;
97+ let _ = rb. enqueue ( 9 ) ;
98+ }
99+ b. iter ( || {
100+ unsafe { output. set_len ( 0 ) } ;
101+ output. extend ( rb. iter ( ) ) ;
102+ assert_eq ! ( output[ output. len( ) / 2 ] , 9 ) ;
103+ assert_eq ! ( output. len( ) , rb_size) ;
104+ } )
105+ } ) ;
106+ group. finish ( ) ;
107+ }
108+
109+ fn benchmark_copy_from_slice_vs_extend < T : RingBuffer < i32 > + SetLen , F : Fn ( ) -> T > (
110+ rb_size : usize ,
111+ rb_type : & str ,
112+ fn_name : & str ,
113+ c : & mut Criterion ,
114+ new : F ,
115+ ) {
116+ let mut group = c. benchmark_group ( format ! ( "{fn_name}({rb_type}, {rb_size})" ) ) ;
117+ let input = vec ! [ 9 ; rb_size] ;
118+ group. bench_function ( format ! ( "CopyFrom({rb_type}; {rb_size})" ) , |b| {
119+ let mut rb = new ( ) ;
120+ rb. fill ( 0 ) ;
121+ // making sure the read/write pointers wrap around
122+ for _ in 0 ..rb_size / 2 {
123+ let _ = rb. dequeue ( ) ;
124+ let _ = rb. enqueue ( 0 ) ;
125+ }
126+ for _ in 0 ..rb_size / 2 { }
127+ b. iter ( || {
128+ rb. copy_from_slice ( 0 , & input) ;
129+ assert_eq ! ( rb[ rb. len( ) / 2 ] , 9 ) ;
130+ assert_eq ! ( rb. len( ) , rb_size) ;
131+ } )
132+ } ) ;
133+ group. bench_function ( format ! ( "ExtendRb({rb_type}; {rb_size})" ) , |b| {
134+ let mut rb = new ( ) ;
135+ // making sure the read/write pointers wrap around
136+ for _ in 0 ..rb_size / 2 {
137+ let _ = rb. dequeue ( ) ;
138+ let _ = rb. enqueue ( 0 ) ;
139+ }
140+ b. iter ( || {
141+ unsafe { rb. set_len ( 0 ) } ;
142+ rb. extend ( input. iter ( ) . copied ( ) ) ;
143+ assert_eq ! ( rb[ rb. len( ) / 2 ] , 9 ) ;
144+ assert_eq ! ( rb. len( ) , rb_size) ;
145+ } )
146+ } ) ;
147+ group. finish ( ) ;
148+ }
149+
66150macro_rules! generate_benches {
67151 ( called, $c: tt, $rb: tt, $ty: tt, $fn: tt, $bmfunc: tt, $( $i: tt) ,* ) => {
68152 $(
@@ -86,6 +170,22 @@ macro_rules! generate_benches {
86170 } ) ) ;
87171 ) *
88172 } ;
173+
174+ ( compare, $c: tt, $rb: tt, $ty: tt, $fn: tt, $bmfunc: tt, $( $i: tt) ,* ) => {
175+ $(
176+ $bmfunc( $i, stringify!( $rb) , stringify!( $bmfunc) , $c, || {
177+ $rb:: <$ty>:: $fn( $i)
178+ } ) ;
179+ ) *
180+ } ;
181+
182+ ( compare_typed, $c: tt, $rb: tt, $ty: tt, $fn: tt, $bmfunc: tt, $( $i: tt) ,* ) => {
183+ $(
184+ $bmfunc( $i, stringify!( $rb) , stringify!( $bmfunc) , $c, || {
185+ $rb:: <$ty, $i>:: $fn( )
186+ } ) ;
187+ ) *
188+ } ;
89189}
90190
91191fn criterion_benchmark ( c : & mut Criterion ) {
@@ -180,6 +280,119 @@ fn criterion_benchmark(c: &mut Criterion) {
180280 8192 ,
181281 8195
182282 ] ;
283+ generate_benches ! [
284+ compare,
285+ c,
286+ AllocRingBuffer ,
287+ i32 ,
288+ new,
289+ benchmark_copy_to_slice_vs_extend,
290+ 16 ,
291+ 1024 ,
292+ 4096 ,
293+ 8192 ,
294+ 1_000_000 ,
295+ 1_048_576
296+ ] ;
297+ generate_benches ! [
298+ compare_typed,
299+ c,
300+ ConstGenericRingBuffer ,
301+ i32 ,
302+ new,
303+ benchmark_copy_to_slice_vs_extend,
304+ 16 ,
305+ 1024 ,
306+ 4096 ,
307+ 8192 ,
308+ 1_000_000 ,
309+ 1_048_576
310+ ] ;
311+ generate_benches ! [
312+ compare,
313+ c,
314+ AllocRingBuffer ,
315+ i32 ,
316+ new,
317+ benchmark_copy_from_slice_vs_extend,
318+ 16 ,
319+ 1024 ,
320+ 4096 ,
321+ 8192 ,
322+ 1_000_000 ,
323+ 1_048_576
324+ ] ;
325+ generate_benches ! [
326+ compare_typed,
327+ c,
328+ ConstGenericRingBuffer ,
329+ i32 ,
330+ new,
331+ benchmark_copy_from_slice_vs_extend,
332+ 16 ,
333+ 1024 ,
334+ 4096 ,
335+ 8192 ,
336+ 1_000_000 ,
337+ 1_048_576
338+ ] ;
339+
340+ generate_benches ! [
341+ compare,
342+ c,
343+ AllocRingBuffer ,
344+ i32 ,
345+ new,
346+ benchmark_copy_to_slice_vs_extend,
347+ 16 ,
348+ 1024 ,
349+ 4096 ,
350+ 8192 ,
351+ 1_000_000 ,
352+ 1_048_576
353+ ] ;
354+ generate_benches ! [
355+ compare_typed,
356+ c,
357+ ConstGenericRingBuffer ,
358+ i32 ,
359+ new,
360+ benchmark_copy_to_slice_vs_extend,
361+ 16 ,
362+ 1024 ,
363+ 4096 ,
364+ 8192 ,
365+ 1_000_000 ,
366+ 1_048_576
367+ ] ;
368+ generate_benches ! [
369+ compare,
370+ c,
371+ AllocRingBuffer ,
372+ i32 ,
373+ new,
374+ benchmark_copy_from_slice_vs_extend,
375+ 16 ,
376+ 1024 ,
377+ 4096 ,
378+ 8192 ,
379+ 1_000_000 ,
380+ 1_048_576
381+ ] ;
382+ generate_benches ! [
383+ compare_typed,
384+ c,
385+ ConstGenericRingBuffer ,
386+ i32 ,
387+ new,
388+ benchmark_copy_from_slice_vs_extend,
389+ 16 ,
390+ 1024 ,
391+ 4096 ,
392+ 8192 ,
393+ 1_000_000 ,
394+ 1_048_576
395+ ] ;
183396}
184397
185398criterion_group ! ( benches, criterion_benchmark) ;
0 commit comments