add benches for simple run criteria (#4196)
# Objective - Add benches for run criteria. This is in anticipation of run criteria being redone in stageless. ## Solution - Benches run criteria that don't access anything to test overhead - Test run criteria that use a query - Test run criteria that use a resource
This commit is contained in:
		
							parent
							
								
									361686a09c
								
							
						
					
					
						commit
						45d2c78949
					
				| @ -27,6 +27,11 @@ name = "system_stage" | |||||||
| path = "benches/bevy_ecs/stages.rs" | path = "benches/bevy_ecs/stages.rs" | ||||||
| harness = false | harness = false | ||||||
| 
 | 
 | ||||||
|  | [[bench]] | ||||||
|  | name = "run_criteria" | ||||||
|  | path = "benches/bevy_ecs/run_criteria.rs" | ||||||
|  | harness = false | ||||||
|  | 
 | ||||||
| [[bench]] | [[bench]] | ||||||
| name = "commands" | name = "commands" | ||||||
| path = "benches/bevy_ecs/commands.rs" | path = "benches/bevy_ecs/commands.rs" | ||||||
|  | |||||||
							
								
								
									
										224
									
								
								benches/benches/bevy_ecs/run_criteria.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								benches/benches/bevy_ecs/run_criteria.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,224 @@ | |||||||
|  | use bevy_ecs::{ | ||||||
|  |     component::Component, | ||||||
|  |     prelude::{ParallelSystemDescriptorCoercion, Res, RunCriteriaDescriptorCoercion}, | ||||||
|  |     schedule::{ShouldRun, Stage, SystemStage}, | ||||||
|  |     system::{IntoSystem, Query}, | ||||||
|  |     world::World, | ||||||
|  | }; | ||||||
|  | use criterion::{criterion_group, criterion_main, Criterion}; | ||||||
|  | 
 | ||||||
|  | criterion_group!( | ||||||
|  |     benches, | ||||||
|  |     run_criteria_yes, | ||||||
|  |     run_criteria_no, | ||||||
|  |     run_criteria_yes_with_labels, | ||||||
|  |     run_criteria_no_with_labels, | ||||||
|  |     run_criteria_yes_with_query, | ||||||
|  |     run_criteria_yes_with_resource | ||||||
|  | ); | ||||||
|  | criterion_main!(benches); | ||||||
|  | 
 | ||||||
|  | fn run_stage(stage: &mut SystemStage, world: &mut World) { | ||||||
|  |     stage.run(world); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn run_criteria_yes(criterion: &mut Criterion) { | ||||||
|  |     let mut world = World::new(); | ||||||
|  |     let mut group = criterion.benchmark_group("run_criteria/yes"); | ||||||
|  |     group.warm_up_time(std::time::Duration::from_millis(500)); | ||||||
|  |     group.measurement_time(std::time::Duration::from_secs(3)); | ||||||
|  |     fn empty() {} | ||||||
|  |     fn always_yes() -> ShouldRun { | ||||||
|  |         ShouldRun::Yes | ||||||
|  |     } | ||||||
|  |     for amount in 0..21 { | ||||||
|  |         let mut stage = SystemStage::parallel(); | ||||||
|  |         stage.add_system(empty.with_run_criteria(always_yes)); | ||||||
|  |         for _ in 0..amount { | ||||||
|  |             // TODO: should change this to use a label or have another bench that uses a label instead
 | ||||||
|  |             stage | ||||||
|  |                 .add_system(empty.with_run_criteria(always_yes)) | ||||||
|  |                 .add_system(empty.with_run_criteria(always_yes)) | ||||||
|  |                 .add_system(empty.with_run_criteria(always_yes)) | ||||||
|  |                 .add_system(empty.with_run_criteria(always_yes)) | ||||||
|  |                 .add_system(empty.with_run_criteria(always_yes)); | ||||||
|  |         } | ||||||
|  |         // run once to initialize systems
 | ||||||
|  |         run_stage(&mut stage, &mut world); | ||||||
|  |         group.bench_function(&format!("{:03}_systems", 5 * amount + 1), |bencher| { | ||||||
|  |             bencher.iter(|| { | ||||||
|  |                 run_stage(&mut stage, &mut world); | ||||||
|  |             }); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     group.finish(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn run_criteria_no(criterion: &mut Criterion) { | ||||||
|  |     let mut world = World::new(); | ||||||
|  |     let mut group = criterion.benchmark_group("run_criteria/no"); | ||||||
|  |     group.warm_up_time(std::time::Duration::from_millis(500)); | ||||||
|  |     group.measurement_time(std::time::Duration::from_secs(3)); | ||||||
|  |     fn empty() {} | ||||||
|  |     fn always_no() -> ShouldRun { | ||||||
|  |         ShouldRun::No | ||||||
|  |     } | ||||||
|  |     for amount in 0..21 { | ||||||
|  |         let mut stage = SystemStage::parallel(); | ||||||
|  |         stage.add_system(empty.with_run_criteria(always_no)); | ||||||
|  |         for _ in 0..amount { | ||||||
|  |             stage | ||||||
|  |                 .add_system(empty.with_run_criteria(always_no)) | ||||||
|  |                 .add_system(empty.with_run_criteria(always_no)) | ||||||
|  |                 .add_system(empty.with_run_criteria(always_no)) | ||||||
|  |                 .add_system(empty.with_run_criteria(always_no)) | ||||||
|  |                 .add_system(empty.with_run_criteria(always_no)); | ||||||
|  |         } | ||||||
|  |         // run once to initialize systems
 | ||||||
|  |         run_stage(&mut stage, &mut world); | ||||||
|  |         group.bench_function(&format!("{:03}_systems", 5 * amount + 1), |bencher| { | ||||||
|  |             bencher.iter(|| { | ||||||
|  |                 run_stage(&mut stage, &mut world); | ||||||
|  |             }); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     group.finish(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn run_criteria_yes_with_labels(criterion: &mut Criterion) { | ||||||
|  |     let mut world = World::new(); | ||||||
|  |     let mut group = criterion.benchmark_group("run_criteria/yes_with_labels"); | ||||||
|  |     group.warm_up_time(std::time::Duration::from_millis(500)); | ||||||
|  |     group.measurement_time(std::time::Duration::from_secs(3)); | ||||||
|  |     fn empty() {} | ||||||
|  |     fn always_yes() -> ShouldRun { | ||||||
|  |         ShouldRun::Yes | ||||||
|  |     } | ||||||
|  |     for amount in 0..21 { | ||||||
|  |         let mut stage = SystemStage::parallel(); | ||||||
|  |         stage.add_system(empty.with_run_criteria(always_yes.label("always yes"))); | ||||||
|  |         for _ in 0..amount { | ||||||
|  |             stage | ||||||
|  |                 .add_system(empty.with_run_criteria("always yes")) | ||||||
|  |                 .add_system(empty.with_run_criteria("always yes")) | ||||||
|  |                 .add_system(empty.with_run_criteria("always yes")) | ||||||
|  |                 .add_system(empty.with_run_criteria("always yes")) | ||||||
|  |                 .add_system(empty.with_run_criteria("always yes")); | ||||||
|  |         } | ||||||
|  |         // run once to initialize systems
 | ||||||
|  |         run_stage(&mut stage, &mut world); | ||||||
|  |         group.bench_function(&format!("{:03}_systems", 5 * amount + 1), |bencher| { | ||||||
|  |             bencher.iter(|| { | ||||||
|  |                 run_stage(&mut stage, &mut world); | ||||||
|  |             }); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     group.finish(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn run_criteria_no_with_labels(criterion: &mut Criterion) { | ||||||
|  |     let mut world = World::new(); | ||||||
|  |     let mut group = criterion.benchmark_group("run_criteria/no_with_labels"); | ||||||
|  |     group.warm_up_time(std::time::Duration::from_millis(500)); | ||||||
|  |     group.measurement_time(std::time::Duration::from_secs(3)); | ||||||
|  |     fn empty() {} | ||||||
|  |     fn always_no() -> ShouldRun { | ||||||
|  |         ShouldRun::No | ||||||
|  |     } | ||||||
|  |     for amount in 0..21 { | ||||||
|  |         let mut stage = SystemStage::parallel(); | ||||||
|  |         stage.add_system(empty.with_run_criteria(always_no.label("always no"))); | ||||||
|  |         for _ in 0..amount { | ||||||
|  |             stage | ||||||
|  |                 .add_system(empty.with_run_criteria("always no")) | ||||||
|  |                 .add_system(empty.with_run_criteria("always no")) | ||||||
|  |                 .add_system(empty.with_run_criteria("always no")) | ||||||
|  |                 .add_system(empty.with_run_criteria("always no")) | ||||||
|  |                 .add_system(empty.with_run_criteria("always no")); | ||||||
|  |         } | ||||||
|  |         // run once to initialize systems
 | ||||||
|  |         run_stage(&mut stage, &mut world); | ||||||
|  |         group.bench_function(&format!("{:03}_systems", 5 * amount + 1), |bencher| { | ||||||
|  |             bencher.iter(|| { | ||||||
|  |                 run_stage(&mut stage, &mut world); | ||||||
|  |             }); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     group.finish(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[derive(Component)] | ||||||
|  | struct TestBool(pub bool); | ||||||
|  | 
 | ||||||
|  | fn run_criteria_yes_with_query(criterion: &mut Criterion) { | ||||||
|  |     let mut world = World::new(); | ||||||
|  |     world.spawn().insert(TestBool(true)); | ||||||
|  |     let mut group = criterion.benchmark_group("run_criteria/yes_using_query"); | ||||||
|  |     group.warm_up_time(std::time::Duration::from_millis(500)); | ||||||
|  |     group.measurement_time(std::time::Duration::from_secs(3)); | ||||||
|  |     fn empty() {} | ||||||
|  |     fn yes_with_query(query: Query<&TestBool>) -> ShouldRun { | ||||||
|  |         let test_bool = query.single(); | ||||||
|  |         if test_bool.0 { | ||||||
|  |             ShouldRun::Yes | ||||||
|  |         } else { | ||||||
|  |             ShouldRun::No | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     for amount in 0..21 { | ||||||
|  |         let mut stage = SystemStage::parallel(); | ||||||
|  |         stage.add_system(empty.with_run_criteria(yes_with_query)); | ||||||
|  |         for _ in 0..amount { | ||||||
|  |             stage | ||||||
|  |                 .add_system(empty.with_run_criteria(yes_with_query)) | ||||||
|  |                 .add_system(empty.with_run_criteria(yes_with_query)) | ||||||
|  |                 .add_system(empty.with_run_criteria(yes_with_query)) | ||||||
|  |                 .add_system(empty.with_run_criteria(yes_with_query)) | ||||||
|  |                 .add_system(empty.with_run_criteria(yes_with_query)); | ||||||
|  |         } | ||||||
|  |         // run once to initialize systems
 | ||||||
|  |         run_stage(&mut stage, &mut world); | ||||||
|  |         group.bench_function(&format!("{:03}_systems", 5 * amount + 1), |bencher| { | ||||||
|  |             bencher.iter(|| { | ||||||
|  |                 run_stage(&mut stage, &mut world); | ||||||
|  |             }); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     group.finish(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn run_criteria_yes_with_resource(criterion: &mut Criterion) { | ||||||
|  |     let mut world = World::new(); | ||||||
|  |     world.insert_resource(TestBool(true)); | ||||||
|  |     let mut group = criterion.benchmark_group("run_criteria/yes_using_resource"); | ||||||
|  |     group.warm_up_time(std::time::Duration::from_millis(500)); | ||||||
|  |     group.measurement_time(std::time::Duration::from_secs(3)); | ||||||
|  |     fn empty() {} | ||||||
|  |     fn yes_with_resource(res: Res<TestBool>) -> ShouldRun { | ||||||
|  |         if res.0 { | ||||||
|  |             ShouldRun::Yes | ||||||
|  |         } else { | ||||||
|  |             ShouldRun::No | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     for amount in 0..21 { | ||||||
|  |         let mut stage = SystemStage::parallel(); | ||||||
|  |         stage.add_system(empty.with_run_criteria(yes_with_resource)); | ||||||
|  |         for _ in 0..amount { | ||||||
|  |             stage | ||||||
|  |                 .add_system(empty.with_run_criteria(yes_with_resource)) | ||||||
|  |                 .add_system(empty.with_run_criteria(yes_with_resource)) | ||||||
|  |                 .add_system(empty.with_run_criteria(yes_with_resource)) | ||||||
|  |                 .add_system(empty.with_run_criteria(yes_with_resource)) | ||||||
|  |                 .add_system(empty.with_run_criteria(yes_with_resource)); | ||||||
|  |         } | ||||||
|  |         // run once to initialize systems
 | ||||||
|  |         run_stage(&mut stage, &mut world); | ||||||
|  |         group.bench_function(&format!("{:03}_systems", 5 * amount + 1), |bencher| { | ||||||
|  |             bencher.iter(|| { | ||||||
|  |                 run_stage(&mut stage, &mut world); | ||||||
|  |             }); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     group.finish(); | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Mike
						Mike