Basic event benchmarks (#8251)
# Objective Fix #7731. Add basic Event sending and iteration benchmarks to bevy_ecs's benchmark suite. ## Solution Add said benchmarks scaling from 100 to 50,000 events. Not sure if I want to include a randomization of the events going in, the current implementation might be too easy for the compiler to optimize. --------- Co-authored-by: JoJoJet <21144246+JoJoJet@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									a954f3e150
								
							
						
					
					
						commit
						8e82c88131
					
				| @ -1,13 +1,15 @@ | |||||||
| use criterion::criterion_main; | use criterion::criterion_main; | ||||||
| 
 | 
 | ||||||
| mod components; | mod components; | ||||||
|  | mod events; | ||||||
| mod iteration; | mod iteration; | ||||||
| mod scheduling; | mod scheduling; | ||||||
| mod world; | mod world; | ||||||
| 
 | 
 | ||||||
| criterion_main!( | criterion_main!( | ||||||
|     iteration::iterations_benches, |  | ||||||
|     components::components_benches, |     components::components_benches, | ||||||
|  |     events::event_benches, | ||||||
|  |     iteration::iterations_benches, | ||||||
|     scheduling::scheduling_benches, |     scheduling::scheduling_benches, | ||||||
|     world::world_benches, |     world::world_benches, | ||||||
| ); | ); | ||||||
|  | |||||||
							
								
								
									
										22
									
								
								benches/benches/bevy_ecs/events/iter.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								benches/benches/bevy_ecs/events/iter.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | use bevy_ecs::prelude::*; | ||||||
|  | 
 | ||||||
|  | pub struct Benchmark<const SIZE: usize>(Events<[u8; SIZE]>); | ||||||
|  | 
 | ||||||
|  | impl<const SIZE: usize> Benchmark<SIZE> { | ||||||
|  |     pub fn new(count: usize) -> Self { | ||||||
|  |         let mut events = Events::default(); | ||||||
|  | 
 | ||||||
|  |         for _ in 0..count { | ||||||
|  |             events.send([0u8; SIZE]); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         Self(events) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn run(&mut self) { | ||||||
|  |         let mut reader = self.0.get_reader(); | ||||||
|  |         for evt in reader.iter(&self.0) { | ||||||
|  |             std::hint::black_box(evt); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										56
									
								
								benches/benches/bevy_ecs/events/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								benches/benches/bevy_ecs/events/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | |||||||
|  | use criterion::*; | ||||||
|  | 
 | ||||||
|  | mod iter; | ||||||
|  | mod send; | ||||||
|  | 
 | ||||||
|  | criterion_group!(event_benches, send, iter,); | ||||||
|  | 
 | ||||||
|  | fn send(c: &mut Criterion) { | ||||||
|  |     let mut group = c.benchmark_group("events_send"); | ||||||
|  |     group.warm_up_time(std::time::Duration::from_millis(500)); | ||||||
|  |     group.measurement_time(std::time::Duration::from_secs(4)); | ||||||
|  |     for count in [100, 1000, 10000, 50000] { | ||||||
|  |         group.bench_function(format!("size_4_events_{}", count), |b| { | ||||||
|  |             let mut bench = send::Benchmark::<4>::new(count); | ||||||
|  |             b.iter(move || bench.run()); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     for count in [100, 1000, 10000, 50000] { | ||||||
|  |         group.bench_function(format!("size_16_events_{}", count), |b| { | ||||||
|  |             let mut bench = send::Benchmark::<16>::new(count); | ||||||
|  |             b.iter(move || bench.run()); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     for count in [100, 1000, 10000, 50000] { | ||||||
|  |         group.bench_function(format!("size_512_events_{}", count), |b| { | ||||||
|  |             let mut bench = send::Benchmark::<512>::new(count); | ||||||
|  |             b.iter(move || bench.run()); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     group.finish(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn iter(c: &mut Criterion) { | ||||||
|  |     let mut group = c.benchmark_group("events_iter"); | ||||||
|  |     group.warm_up_time(std::time::Duration::from_millis(500)); | ||||||
|  |     group.measurement_time(std::time::Duration::from_secs(4)); | ||||||
|  |     for count in [100, 1000, 10000, 50000] { | ||||||
|  |         group.bench_function(format!("size_4_events_{}", count), |b| { | ||||||
|  |             let mut bench = iter::Benchmark::<4>::new(count); | ||||||
|  |             b.iter(move || bench.run()); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     for count in [100, 1000, 10000, 50000] { | ||||||
|  |         group.bench_function(format!("size_16_events_{}", count), |b| { | ||||||
|  |             let mut bench = iter::Benchmark::<4>::new(count); | ||||||
|  |             b.iter(move || bench.run()); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     for count in [100, 1000, 10000, 50000] { | ||||||
|  |         group.bench_function(format!("size_512_events_{}", count), |b| { | ||||||
|  |             let mut bench = iter::Benchmark::<512>::new(count); | ||||||
|  |             b.iter(move || bench.run()); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     group.finish(); | ||||||
|  | } | ||||||
							
								
								
									
										29
									
								
								benches/benches/bevy_ecs/events/send.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								benches/benches/bevy_ecs/events/send.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | use bevy_ecs::prelude::*; | ||||||
|  | 
 | ||||||
|  | pub struct Benchmark<const SIZE: usize> { | ||||||
|  |     events: Events<[u8; SIZE]>, | ||||||
|  |     count: usize, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl<const SIZE: usize> Benchmark<SIZE> { | ||||||
|  |     pub fn new(count: usize) -> Self { | ||||||
|  |         let mut events = Events::default(); | ||||||
|  |         
 | ||||||
|  |         // Force both internal buffers to be allocated.
 | ||||||
|  |         for _ in 0..2 { | ||||||
|  |             for _ in 0..count { | ||||||
|  |                 events.send([0u8; SIZE]); | ||||||
|  |             } | ||||||
|  |             events.update(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         Self { events, count } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn run(&mut self) { | ||||||
|  |         for _ in 0..self.count { | ||||||
|  |             self.events.send(std::hint::black_box([0u8; SIZE])); | ||||||
|  |         } | ||||||
|  |         self.events.update(); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 James Liu
						James Liu