From c98b90c9cc435c94ca5cbd7b082220c6947ee7a6 Mon Sep 17 00:00:00 2001 From: Trashtalk Date: Sat, 19 Jul 2025 22:28:06 +0000 Subject: [PATCH 1/2] make benches more sane --- benches/benches/bevy_ecs/world/world_get.rs | 94 +++++++++------------ 1 file changed, 40 insertions(+), 54 deletions(-) diff --git a/benches/benches/bevy_ecs/world/world_get.rs b/benches/benches/bevy_ecs/world/world_get.rs index 81e0bf2b0f511..e7d3879595e6b 100644 --- a/benches/benches/bevy_ecs/world/world_get.rs +++ b/benches/benches/bevy_ecs/world/world_get.rs @@ -1,10 +1,9 @@ use core::hint::black_box; -use nonmax::NonMaxU32; use bevy_ecs::{ bundle::{Bundle, NoBundleEffect}, component::Component, - entity::{Entity, EntityRow}, + entity::Entity, system::{Query, SystemState}, world::World, }; @@ -31,16 +30,24 @@ fn deterministic_rand() -> ChaCha8Rng { ChaCha8Rng::seed_from_u64(42) } -fn setup(entity_count: u32) -> World { +fn setup(entity_count: u32) -> (World, Vec) { let mut world = World::default(); - world.spawn_batch((0..entity_count).map(|_| T::default())); - black_box(world) + let entities: Vec = world + .spawn_batch((0..entity_count).map(|_| T::default())) + .into_iter() + .collect(); + black_box((world, entities)) } -fn setup_wide + Default>(entity_count: u32) -> World { +fn setup_wide + Default>( + entity_count: u32, +) -> (World, Vec) { let mut world = World::default(); - world.spawn_batch((0..entity_count).map(|_| T::default())); - black_box(world) + let entities: Vec = world + .spawn_batch((0..entity_count).map(|_| T::default())) + .into_iter() + .collect(); + black_box((world, entities)) } pub fn world_entity(criterion: &mut Criterion) { @@ -50,14 +57,11 @@ pub fn world_entity(criterion: &mut Criterion) { for entity_count in RANGE.map(|i| i * 10_000) { group.bench_function(format!("{entity_count}_entities"), |bencher| { - let world = setup::(entity_count); + let (world, entities) = setup::
(entity_count); bencher.iter(|| { - for i in 0..entity_count { - let entity = - // SAFETY: Range is exclusive. - Entity::from_raw(EntityRow::new(unsafe { NonMaxU32::new_unchecked(i) })); - black_box(world.entity(entity)); + for entity in &entities { + black_box(world.entity(*entity)); } }); }); @@ -73,26 +77,20 @@ pub fn world_get(criterion: &mut Criterion) { for entity_count in RANGE.map(|i| i * 10_000) { group.bench_function(format!("{entity_count}_entities_table"), |bencher| { - let world = setup::
(entity_count); + let (world, entities) = setup::
(entity_count); bencher.iter(|| { - for i in 0..entity_count { - let entity = - // SAFETY: Range is exclusive. - Entity::from_raw(EntityRow::new(unsafe { NonMaxU32::new_unchecked(i) })); - assert!(world.get::
(entity).is_some()); + for entity in &entities { + assert!(world.get::
(*entity).is_some()); } }); }); group.bench_function(format!("{entity_count}_entities_sparse"), |bencher| { - let world = setup::(entity_count); + let (world, entities) = setup::(entity_count); bencher.iter(|| { - for i in 0..entity_count { - let entity = - // SAFETY: Range is exclusive. - Entity::from_raw(EntityRow::new(unsafe { NonMaxU32::new_unchecked(i) })); - assert!(world.get::(entity).is_some()); + for entity in &entities { + assert!(world.get::(*entity).is_some()); } }); }); @@ -108,20 +106,17 @@ pub fn world_query_get(criterion: &mut Criterion) { for entity_count in RANGE.map(|i| i * 10_000) { group.bench_function(format!("{entity_count}_entities_table"), |bencher| { - let mut world = setup::
(entity_count); + let (mut world, entities) = setup::
(entity_count); let mut query = world.query::<&Table>(); bencher.iter(|| { - for i in 0..entity_count { - let entity = - // SAFETY: Range is exclusive. - Entity::from_raw(EntityRow::new(unsafe { NonMaxU32::new_unchecked(i) })); - assert!(query.get(&world, entity).is_ok()); + for entity in &entities { + assert!(query.get(&world, *entity).is_ok()); } }); }); group.bench_function(format!("{entity_count}_entities_table_wide"), |bencher| { - let mut world = setup_wide::<( + let (mut world, entities) = setup_wide::<( WideTable<0>, WideTable<1>, WideTable<2>, @@ -139,29 +134,23 @@ pub fn world_query_get(criterion: &mut Criterion) { )>(); bencher.iter(|| { - for i in 0..entity_count { - let entity = - // SAFETY: Range is exclusive. - Entity::from_raw(EntityRow::new(unsafe { NonMaxU32::new_unchecked(i) })); - assert!(query.get(&world, entity).is_ok()); + for entity in &entities { + assert!(query.get(&world, *entity).is_ok()); } }); }); group.bench_function(format!("{entity_count}_entities_sparse"), |bencher| { - let mut world = setup::(entity_count); + let (mut world, entities) = setup::(entity_count); let mut query = world.query::<&Sparse>(); bencher.iter(|| { - for i in 0..entity_count { - let entity = - // SAFETY: Range is exclusive. - Entity::from_raw(EntityRow::new(unsafe { NonMaxU32::new_unchecked(i) })); - assert!(query.get(&world, entity).is_ok()); + for entity in &entities { + assert!(query.get(&world, *entity).is_ok()); } }); }); group.bench_function(format!("{entity_count}_entities_sparse_wide"), |bencher| { - let mut world = setup_wide::<( + let (mut world, entities) = setup_wide::<( WideSparse<0>, WideSparse<1>, WideSparse<2>, @@ -179,11 +168,8 @@ pub fn world_query_get(criterion: &mut Criterion) { )>(); bencher.iter(|| { - for i in 0..entity_count { - // SAFETY: Range is exclusive. - let entity = - Entity::from_raw(EntityRow::new(unsafe { NonMaxU32::new_unchecked(i) })); - assert!(query.get(&world, entity).is_ok()); + for entity in &entities { + assert!(query.get(&world, *entity).is_ok()); } }); }); @@ -199,7 +185,7 @@ pub fn world_query_iter(criterion: &mut Criterion) { for entity_count in RANGE.map(|i| i * 10_000) { group.bench_function(format!("{entity_count}_entities_table"), |bencher| { - let mut world = setup::
(entity_count); + let (mut world, _) = setup::
(entity_count); let mut query = world.query::<&Table>(); bencher.iter(|| { @@ -213,7 +199,7 @@ pub fn world_query_iter(criterion: &mut Criterion) { }); }); group.bench_function(format!("{entity_count}_entities_sparse"), |bencher| { - let mut world = setup::(entity_count); + let (mut world, _) = setup::(entity_count); let mut query = world.query::<&Sparse>(); bencher.iter(|| { @@ -238,7 +224,7 @@ pub fn world_query_for_each(criterion: &mut Criterion) { for entity_count in RANGE.map(|i| i * 10_000) { group.bench_function(format!("{entity_count}_entities_table"), |bencher| { - let mut world = setup::
(entity_count); + let (mut world, _) = setup::
(entity_count); let mut query = world.query::<&Table>(); bencher.iter(|| { @@ -252,7 +238,7 @@ pub fn world_query_for_each(criterion: &mut Criterion) { }); }); group.bench_function(format!("{entity_count}_entities_sparse"), |bencher| { - let mut world = setup::(entity_count); + let (mut world, _) = setup::(entity_count); let mut query = world.query::<&Sparse>(); bencher.iter(|| { From a37b1ea3ba72299fbc11d736fb540e78c7147e5b Mon Sep 17 00:00:00 2001 From: Trashtalk Date: Sat, 19 Jul 2025 22:45:37 +0000 Subject: [PATCH 2/2] cargo clippy --- benches/benches/bevy_ecs/world/world_get.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/benches/benches/bevy_ecs/world/world_get.rs b/benches/benches/bevy_ecs/world/world_get.rs index e7d3879595e6b..dc5c2c5caf420 100644 --- a/benches/benches/bevy_ecs/world/world_get.rs +++ b/benches/benches/bevy_ecs/world/world_get.rs @@ -34,7 +34,6 @@ fn setup(entity_count: u32) -> (World, Vec) { let mut world = World::default(); let entities: Vec = world .spawn_batch((0..entity_count).map(|_| T::default())) - .into_iter() .collect(); black_box((world, entities)) } @@ -45,7 +44,6 @@ fn setup_wide + Default>( let mut world = World::default(); let entities: Vec = world .spawn_batch((0..entity_count).map(|_| T::default())) - .into_iter() .collect(); black_box((world, entities)) }