Last active
June 6, 2025 00:06
-
-
Save SanderMertens/b98ea829a1477f9b8620dd5878f707a3 to your computer and use it in GitHub Desktop.
Bevy benchmark
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Code uses a custom benchmarking solution (vs. criterion) so that the numbers | |
| // are comparable to the Flecs benchmarks in this repository: | |
| // https://github.com/SanderMertens/ecs_benchmark | |
| use bevy_ecs::prelude::*; | |
| // use bevy_hierarchy::*; | |
| use bevy_ecs::world::CommandQueue; | |
| use std::hint::black_box; | |
| use rand; | |
| use std::time::{Instant}; | |
| #[derive(Component)] | |
| struct C1(f32); | |
| #[derive(Component)] | |
| struct C2(f32); | |
| #[derive(Component)] | |
| struct C3(f32); | |
| #[derive(Component)] | |
| struct C4(f32); | |
| #[derive(Component)] | |
| struct C5(f32); | |
| #[derive(Component)] | |
| struct C6(f32); | |
| #[derive(Component)] | |
| struct C7(f32); | |
| #[derive(Component)] | |
| struct C8(f32); | |
| #[derive(Component)] | |
| struct C9(f32); | |
| #[derive(Component)] | |
| struct C10(f32); | |
| #[derive(Component)] | |
| struct C11(f32); | |
| #[derive(Component)] | |
| struct C12(f32); | |
| #[derive(Component)] | |
| struct C13(f32); | |
| #[derive(Component)] | |
| struct C14(f32); | |
| #[derive(Component)] | |
| struct C15(f32); | |
| #[derive(Component)] | |
| struct C16(f32); | |
| #[derive(Component)] | |
| struct C17(f32); | |
| #[derive(Component)] | |
| struct C18(f32); | |
| #[derive(Component)] | |
| struct C19(f32); | |
| #[derive(Component)] | |
| struct C20(f32); | |
| #[derive(Component)] | |
| struct C21(f32); | |
| #[derive(Component)] | |
| struct C22(f32); | |
| #[derive(Component)] | |
| struct C23(f32); | |
| #[derive(Component)] | |
| struct C24(f32); | |
| #[derive(Component)] | |
| struct C25(f32); | |
| #[derive(Component)] | |
| struct C26(f32); | |
| #[derive(Component)] | |
| struct C27(f32); | |
| #[derive(Component)] | |
| struct C28(f32); | |
| #[derive(Component)] | |
| struct C29(f32); | |
| #[derive(Component)] | |
| struct C30(f32); | |
| #[derive(Component)] | |
| struct C31(f32); | |
| #[derive(Component)] | |
| struct C32(f32); | |
| #[derive(Component)] | |
| struct T1(); | |
| #[derive(Component)] | |
| struct T2(); | |
| #[derive(Component)] | |
| struct T3(); | |
| #[derive(Component)] | |
| struct T4(); | |
| #[derive(Component)] | |
| struct T5(); | |
| #[derive(Component)] | |
| struct T6(); | |
| #[derive(Component)] | |
| struct T7(); | |
| #[derive(Component)] | |
| struct T8(); | |
| #[derive(Component)] | |
| struct T9(); | |
| #[derive(Component)] | |
| struct T10(); | |
| #[derive(Component)] | |
| struct T11(); | |
| #[derive(Component)] | |
| struct T12(); | |
| #[derive(Component)] | |
| struct T13(); | |
| #[derive(Component)] | |
| struct T14(); | |
| #[derive(Component)] | |
| struct T15(); | |
| #[derive(Component)] | |
| struct T16(); | |
| #[derive(Component)] | |
| struct T17(); | |
| #[derive(Component)] | |
| struct T18(); | |
| #[derive(Component)] | |
| struct T19(); | |
| #[derive(Component)] | |
| struct T20(); | |
| #[derive(Component)] | |
| struct T21(); | |
| #[derive(Component)] | |
| struct T22(); | |
| #[derive(Component)] | |
| struct T23(); | |
| #[derive(Component)] | |
| struct T24(); | |
| #[derive(Component)] | |
| struct T25(); | |
| #[derive(Component)] | |
| struct T26(); | |
| #[derive(Component)] | |
| struct T27(); | |
| #[derive(Component)] | |
| struct T28(); | |
| #[derive(Component)] | |
| struct T29(); | |
| #[derive(Component)] | |
| struct T30(); | |
| #[derive(Component)] | |
| struct T31(); | |
| #[derive(Component)] | |
| struct T32(); | |
| fn print_result(name : &str, duration : std::time::Duration, count : u32) { | |
| let mut duration = duration.as_nanos() as f64; | |
| duration /= count as f64; | |
| println!("{} {:.2}", name, duration); | |
| } | |
| fn get_empty() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let _ = world.get::<C1>(*e); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_get_empty", start.elapsed(), | |
| count * entities.len() as u32); | |
| } | |
| fn get_not_found() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn(C1(0.0)).id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let _ = world.get::<C2>(*e); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_get_not_found", start.elapsed(), | |
| count * entities.len() as u32); | |
| } | |
| fn get_1() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn(C1(0.0)).id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let _ = world.get::<C1>(*e); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_get_1", start.elapsed(), | |
| count * entities.len() as u32); | |
| } | |
| fn add_remove_1_tags() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let mut emut = world.entity_mut(*e); | |
| emut.insert(T1()); | |
| emut.remove::<T1>(); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_1_tag", start.elapsed(), | |
| 2 * count * entities.len() as u32); | |
| } | |
| fn add_remove_2_tags() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let mut emut = world.entity_mut(*e); | |
| emut.insert(T1()); | |
| emut.insert(T2()); | |
| emut.remove::<T1>(); | |
| emut.remove::<T2>(); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_2_tags", start.elapsed(), | |
| 4 * count * entities.len() as u32); | |
| } | |
| fn add_remove_16_tags() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let mut emut = world.entity_mut(*e); | |
| emut.insert(T1()); | |
| emut.insert(T2()); | |
| emut.insert(T3()); | |
| emut.insert(T4()); | |
| emut.insert(T5()); | |
| emut.insert(T6()); | |
| emut.insert(T7()); | |
| emut.insert(T8()); | |
| emut.insert(T9()); | |
| emut.insert(T10()); | |
| emut.insert(T11()); | |
| emut.insert(T12()); | |
| emut.insert(T13()); | |
| emut.insert(T14()); | |
| emut.insert(T15()); | |
| emut.insert(T16()); | |
| emut.remove::<T1>(); | |
| emut.remove::<T2>(); | |
| emut.remove::<T3>(); | |
| emut.remove::<T4>(); | |
| emut.remove::<T5>(); | |
| emut.remove::<T6>(); | |
| emut.remove::<T7>(); | |
| emut.remove::<T8>(); | |
| emut.remove::<T9>(); | |
| emut.remove::<T10>(); | |
| emut.remove::<T11>(); | |
| emut.remove::<T12>(); | |
| emut.remove::<T13>(); | |
| emut.remove::<T14>(); | |
| emut.remove::<T15>(); | |
| emut.remove::<T16>(); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_16_tags", start.elapsed(), | |
| 32 * count * entities.len() as u32); | |
| } | |
| fn add_remove_32_tags() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let mut emut = world.entity_mut(*e); | |
| emut.insert(T1()); | |
| emut.insert(T2()); | |
| emut.insert(T3()); | |
| emut.insert(T4()); | |
| emut.insert(T5()); | |
| emut.insert(T6()); | |
| emut.insert(T7()); | |
| emut.insert(T8()); | |
| emut.insert(T9()); | |
| emut.insert(T10()); | |
| emut.insert(T11()); | |
| emut.insert(T12()); | |
| emut.insert(T13()); | |
| emut.insert(T14()); | |
| emut.insert(T15()); | |
| emut.insert(T16()); | |
| emut.insert(T17()); | |
| emut.insert(T18()); | |
| emut.insert(T19()); | |
| emut.insert(T20()); | |
| emut.insert(T21()); | |
| emut.insert(T22()); | |
| emut.insert(T23()); | |
| emut.insert(T24()); | |
| emut.insert(T25()); | |
| emut.insert(T26()); | |
| emut.insert(T27()); | |
| emut.insert(T28()); | |
| emut.insert(T29()); | |
| emut.insert(T30()); | |
| emut.insert(T31()); | |
| emut.insert(T32()); | |
| emut.remove::<T1>(); | |
| emut.remove::<T2>(); | |
| emut.remove::<T3>(); | |
| emut.remove::<T4>(); | |
| emut.remove::<T5>(); | |
| emut.remove::<T6>(); | |
| emut.remove::<T7>(); | |
| emut.remove::<T8>(); | |
| emut.remove::<T9>(); | |
| emut.remove::<T10>(); | |
| emut.remove::<T11>(); | |
| emut.remove::<T12>(); | |
| emut.remove::<T13>(); | |
| emut.remove::<T14>(); | |
| emut.remove::<T15>(); | |
| emut.remove::<T16>(); | |
| emut.remove::<T17>(); | |
| emut.remove::<T18>(); | |
| emut.remove::<T19>(); | |
| emut.remove::<T20>(); | |
| emut.remove::<T21>(); | |
| emut.remove::<T22>(); | |
| emut.remove::<T23>(); | |
| emut.remove::<T24>(); | |
| emut.remove::<T25>(); | |
| emut.remove::<T26>(); | |
| emut.remove::<T27>(); | |
| emut.remove::<T28>(); | |
| emut.remove::<T29>(); | |
| emut.remove::<T30>(); | |
| emut.remove::<T31>(); | |
| emut.remove::<T32>(); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_32_tags", start.elapsed(), | |
| 64 * count * entities.len() as u32); | |
| } | |
| fn add_remove_1_components() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let mut emut = world.entity_mut(*e); | |
| emut.insert(C1(0.0)); | |
| emut.remove::<C1>(); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_1_component", start.elapsed(), | |
| 2 * count * entities.len() as u32); | |
| } | |
| fn add_remove_2_components() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let mut emut = world.entity_mut(*e); | |
| emut.insert(C1(0.0)); | |
| emut.insert(C2(0.0)); | |
| emut.remove::<C1>(); | |
| emut.remove::<C2>(); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_2_components", start.elapsed(), | |
| 4 * count * entities.len() as u32); | |
| } | |
| fn add_remove_16_components() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let mut emut = world.entity_mut(*e); | |
| emut.insert(C1(0.0)); | |
| emut.insert(C2(0.0)); | |
| emut.insert(C3(0.0)); | |
| emut.insert(C4(0.0)); | |
| emut.insert(C5(0.0)); | |
| emut.insert(C6(0.0)); | |
| emut.insert(C7(0.0)); | |
| emut.insert(C8(0.0)); | |
| emut.insert(C9(0.0)); | |
| emut.insert(C10(0.0)); | |
| emut.insert(C11(0.0)); | |
| emut.insert(C12(0.0)); | |
| emut.insert(C13(0.0)); | |
| emut.insert(C14(0.0)); | |
| emut.insert(C15(0.0)); | |
| emut.insert(C16(0.0)); | |
| emut.remove::<C1>(); | |
| emut.remove::<C2>(); | |
| emut.remove::<C3>(); | |
| emut.remove::<C4>(); | |
| emut.remove::<C5>(); | |
| emut.remove::<C6>(); | |
| emut.remove::<C7>(); | |
| emut.remove::<C8>(); | |
| emut.remove::<C9>(); | |
| emut.remove::<C10>(); | |
| emut.remove::<C11>(); | |
| emut.remove::<C12>(); | |
| emut.remove::<C13>(); | |
| emut.remove::<C14>(); | |
| emut.remove::<C15>(); | |
| emut.remove::<C16>(); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_16_components", start.elapsed(), | |
| 32 * count * entities.len() as u32); | |
| } | |
| fn add_remove_32_components() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let mut emut = world.entity_mut(*e); | |
| emut.insert(C1(0.0)); | |
| emut.insert(C2(0.0)); | |
| emut.insert(C3(0.0)); | |
| emut.insert(C4(0.0)); | |
| emut.insert(C5(0.0)); | |
| emut.insert(C6(0.0)); | |
| emut.insert(C7(0.0)); | |
| emut.insert(C8(0.0)); | |
| emut.insert(C9(0.0)); | |
| emut.insert(C10(0.0)); | |
| emut.insert(C11(0.0)); | |
| emut.insert(C12(0.0)); | |
| emut.insert(C13(0.0)); | |
| emut.insert(C14(0.0)); | |
| emut.insert(C15(0.0)); | |
| emut.insert(C16(0.0)); | |
| emut.insert(C17(0.0)); | |
| emut.insert(C18(0.0)); | |
| emut.insert(C19(0.0)); | |
| emut.insert(C20(0.0)); | |
| emut.insert(C21(0.0)); | |
| emut.insert(C22(0.0)); | |
| emut.insert(C23(0.0)); | |
| emut.insert(C24(0.0)); | |
| emut.insert(C25(0.0)); | |
| emut.insert(C26(0.0)); | |
| emut.insert(C27(0.0)); | |
| emut.insert(C28(0.0)); | |
| emut.insert(C29(0.0)); | |
| emut.insert(C30(0.0)); | |
| emut.insert(C31(0.0)); | |
| emut.insert(C32(0.0)); | |
| emut.remove::<C1>(); | |
| emut.remove::<C2>(); | |
| emut.remove::<C3>(); | |
| emut.remove::<C4>(); | |
| emut.remove::<C5>(); | |
| emut.remove::<C6>(); | |
| emut.remove::<C7>(); | |
| emut.remove::<C8>(); | |
| emut.remove::<C9>(); | |
| emut.remove::<C10>(); | |
| emut.remove::<C11>(); | |
| emut.remove::<C12>(); | |
| emut.remove::<C13>(); | |
| emut.remove::<C14>(); | |
| emut.remove::<C15>(); | |
| emut.remove::<C16>(); | |
| emut.remove::<C17>(); | |
| emut.remove::<C18>(); | |
| emut.remove::<C19>(); | |
| emut.remove::<C20>(); | |
| emut.remove::<C21>(); | |
| emut.remove::<C22>(); | |
| emut.remove::<C23>(); | |
| emut.remove::<C24>(); | |
| emut.remove::<C25>(); | |
| emut.remove::<C26>(); | |
| emut.remove::<C27>(); | |
| emut.remove::<C28>(); | |
| emut.remove::<C29>(); | |
| emut.remove::<C30>(); | |
| emut.remove::<C31>(); | |
| emut.remove::<C32>(); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_32_components", start.elapsed(), | |
| 64 * count * entities.len() as u32); | |
| } | |
| fn add_existing_1_tag() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn(T1()).id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let mut emut = world.entity_mut(*e); | |
| emut.insert(T1()); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_existing_1_tag", start.elapsed(), | |
| count * entities.len() as u32); | |
| } | |
| fn insert() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn(C1(0.0)).id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let mut emut = world.entity_mut(*e); | |
| emut.insert(T1()); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_insert", start.elapsed(), | |
| count * entities.len() as u32); | |
| } | |
| fn get_mut() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn(C1(0.0)).id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let mut emut = world.entity_mut(*e); | |
| let foo = emut.get_mut::<C1>(); | |
| black_box(foo); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_get_mut", start.elapsed(), | |
| count * entities.len() as u32); | |
| } | |
| fn get_mut_not_found() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn(C1(0.0)).id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| for e in &entities { | |
| let _ = world.get_mut::<C2>(*e); | |
| } | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_get_not_found", start.elapsed(), | |
| count * entities.len() as u32); | |
| } | |
| fn add_remove_cmd_1_tags() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| let mut cmdqueue = CommandQueue::default(); | |
| let mut cmds = Commands::new(&mut cmdqueue, &world); | |
| for e in &entities { | |
| let mut emut = cmds.entity(*e); | |
| emut.insert(T1()); | |
| emut.remove::<T1>(); | |
| } | |
| cmdqueue.apply(&mut world); | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_cmd_1_tag", start.elapsed(), | |
| 2 * count * entities.len() as u32); | |
| } | |
| fn add_remove_cmd_1_components() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| let mut cmdqueue = CommandQueue::default(); | |
| let mut cmds = Commands::new(&mut cmdqueue, &world); | |
| for e in &entities { | |
| let mut emut = cmds.entity(*e); | |
| emut.insert(C1(0.0)); | |
| emut.remove::<C1>(); | |
| } | |
| cmdqueue.apply(&mut world); | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_cmd_1_component", start.elapsed(), | |
| 2 * count * entities.len() as u32); | |
| } | |
| fn add_remove_cmd_16_tags() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| let mut cmdqueue = CommandQueue::default(); | |
| let mut cmds = Commands::new(&mut cmdqueue, &world); | |
| for e in &entities { | |
| let mut emut = cmds.entity(*e); | |
| emut.insert(T1()); | |
| emut.insert(T2()); | |
| emut.insert(T3()); | |
| emut.insert(T4()); | |
| emut.insert(T5()); | |
| emut.insert(T6()); | |
| emut.insert(T7()); | |
| emut.insert(T8()); | |
| emut.insert(T9()); | |
| emut.insert(T10()); | |
| emut.insert(T11()); | |
| emut.insert(T12()); | |
| emut.insert(T13()); | |
| emut.insert(T14()); | |
| emut.insert(T15()); | |
| emut.insert(T16()); | |
| emut.remove::<T1>(); | |
| emut.remove::<T2>(); | |
| emut.remove::<T3>(); | |
| emut.remove::<T4>(); | |
| emut.remove::<T5>(); | |
| emut.remove::<T6>(); | |
| emut.remove::<T7>(); | |
| emut.remove::<T8>(); | |
| emut.remove::<T9>(); | |
| emut.remove::<T10>(); | |
| emut.remove::<T11>(); | |
| emut.remove::<T12>(); | |
| emut.remove::<T13>(); | |
| emut.remove::<T14>(); | |
| emut.remove::<T15>(); | |
| emut.remove::<T16>(); | |
| } | |
| cmdqueue.apply(&mut world); | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_cmd_16_tags", start.elapsed(), | |
| 2 * 16 * count * entities.len() as u32); | |
| } | |
| fn add_remove_cmd_16_components() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| let mut cmdqueue = CommandQueue::default(); | |
| let mut cmds = Commands::new(&mut cmdqueue, &world); | |
| for e in &entities { | |
| let mut emut = cmds.entity(*e); | |
| emut.insert(C1(0.0)); | |
| emut.insert(C2(0.0)); | |
| emut.insert(C3(0.0)); | |
| emut.insert(C4(0.0)); | |
| emut.insert(C5(0.0)); | |
| emut.insert(C6(0.0)); | |
| emut.insert(C7(0.0)); | |
| emut.insert(C8(0.0)); | |
| emut.insert(C9(0.0)); | |
| emut.insert(C10(0.0)); | |
| emut.insert(C11(0.0)); | |
| emut.insert(C12(0.0)); | |
| emut.insert(C13(0.0)); | |
| emut.insert(C14(0.0)); | |
| emut.insert(C15(0.0)); | |
| emut.insert(C16(0.0)); | |
| emut.remove::<C1>(); | |
| emut.remove::<C2>(); | |
| emut.remove::<C3>(); | |
| emut.remove::<C4>(); | |
| emut.remove::<C5>(); | |
| emut.remove::<C6>(); | |
| emut.remove::<C7>(); | |
| emut.remove::<C8>(); | |
| emut.remove::<C9>(); | |
| emut.remove::<C10>(); | |
| emut.remove::<C11>(); | |
| emut.remove::<C12>(); | |
| emut.remove::<C13>(); | |
| emut.remove::<C14>(); | |
| emut.remove::<C15>(); | |
| emut.remove::<C16>(); | |
| } | |
| cmdqueue.apply(&mut world); | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_cmd_16_components", start.elapsed(), | |
| 2 * 16 * count * entities.len() as u32); | |
| } | |
| fn add_remove_cmd_32_tags() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| let mut cmdqueue = CommandQueue::default(); | |
| let mut cmds = Commands::new(&mut cmdqueue, &world); | |
| for e in &entities { | |
| let mut emut = cmds.entity(*e); | |
| emut.insert(T1()); | |
| emut.insert(T2()); | |
| emut.insert(T3()); | |
| emut.insert(T4()); | |
| emut.insert(T5()); | |
| emut.insert(T6()); | |
| emut.insert(T7()); | |
| emut.insert(T8()); | |
| emut.insert(T9()); | |
| emut.insert(T10()); | |
| emut.insert(T11()); | |
| emut.insert(T12()); | |
| emut.insert(T13()); | |
| emut.insert(T14()); | |
| emut.insert(T15()); | |
| emut.insert(T16()); | |
| emut.insert(T17()); | |
| emut.insert(T18()); | |
| emut.insert(T19()); | |
| emut.insert(T20()); | |
| emut.insert(T21()); | |
| emut.insert(T22()); | |
| emut.insert(T23()); | |
| emut.insert(T24()); | |
| emut.insert(T25()); | |
| emut.insert(T26()); | |
| emut.insert(T27()); | |
| emut.insert(T28()); | |
| emut.insert(T29()); | |
| emut.insert(T30()); | |
| emut.insert(T31()); | |
| emut.insert(T32()); | |
| emut.remove::<T1>(); | |
| emut.remove::<T2>(); | |
| emut.remove::<T3>(); | |
| emut.remove::<T4>(); | |
| emut.remove::<T5>(); | |
| emut.remove::<T6>(); | |
| emut.remove::<T7>(); | |
| emut.remove::<T8>(); | |
| emut.remove::<T9>(); | |
| emut.remove::<T10>(); | |
| emut.remove::<T11>(); | |
| emut.remove::<T12>(); | |
| emut.remove::<T13>(); | |
| emut.remove::<T14>(); | |
| emut.remove::<T15>(); | |
| emut.remove::<T16>(); | |
| emut.remove::<T17>(); | |
| emut.remove::<T18>(); | |
| emut.remove::<T19>(); | |
| emut.remove::<T20>(); | |
| emut.remove::<T21>(); | |
| emut.remove::<T22>(); | |
| emut.remove::<T23>(); | |
| emut.remove::<T24>(); | |
| emut.remove::<T25>(); | |
| emut.remove::<T26>(); | |
| emut.remove::<T27>(); | |
| emut.remove::<T28>(); | |
| emut.remove::<T29>(); | |
| emut.remove::<T30>(); | |
| emut.remove::<T31>(); | |
| emut.remove::<T32>(); | |
| } | |
| cmdqueue.apply(&mut world); | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_cmd_32_tags", start.elapsed(), | |
| 2 * 32 * count * entities.len() as u32); | |
| } | |
| fn add_remove_cmd_32_components() { | |
| let mut world = World::new(); | |
| let mut entities = Vec::with_capacity(1000); | |
| for _ in 0..1000 { | |
| entities.push(world.spawn_empty().id()); | |
| } | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| loop { | |
| let mut cmdqueue = CommandQueue::default(); | |
| let mut cmds = Commands::new(&mut cmdqueue, &world); | |
| for e in &entities { | |
| let mut emut = cmds.entity(*e); | |
| emut.insert(C1(0.0)); | |
| emut.insert(C2(0.0)); | |
| emut.insert(C3(0.0)); | |
| emut.insert(C4(0.0)); | |
| emut.insert(C5(0.0)); | |
| emut.insert(C6(0.0)); | |
| emut.insert(C7(0.0)); | |
| emut.insert(C8(0.0)); | |
| emut.insert(C9(0.0)); | |
| emut.insert(C10(0.0)); | |
| emut.insert(C11(0.0)); | |
| emut.insert(C12(0.0)); | |
| emut.insert(C13(0.0)); | |
| emut.insert(C14(0.0)); | |
| emut.insert(C15(0.0)); | |
| emut.insert(C16(0.0)); | |
| emut.insert(C17(0.0)); | |
| emut.insert(C18(0.0)); | |
| emut.insert(C19(0.0)); | |
| emut.insert(C20(0.0)); | |
| emut.insert(C21(0.0)); | |
| emut.insert(C22(0.0)); | |
| emut.insert(C23(0.0)); | |
| emut.insert(C24(0.0)); | |
| emut.insert(C25(0.0)); | |
| emut.insert(C26(0.0)); | |
| emut.insert(C27(0.0)); | |
| emut.insert(C28(0.0)); | |
| emut.insert(C29(0.0)); | |
| emut.insert(C30(0.0)); | |
| emut.insert(C31(0.0)); | |
| emut.insert(C32(0.0)); | |
| emut.remove::<C1>(); | |
| emut.remove::<C2>(); | |
| emut.remove::<C3>(); | |
| emut.remove::<C4>(); | |
| emut.remove::<C5>(); | |
| emut.remove::<C6>(); | |
| emut.remove::<C7>(); | |
| emut.remove::<C8>(); | |
| emut.remove::<C9>(); | |
| emut.remove::<C10>(); | |
| emut.remove::<C11>(); | |
| emut.remove::<C12>(); | |
| emut.remove::<C13>(); | |
| emut.remove::<C14>(); | |
| emut.remove::<C15>(); | |
| emut.remove::<C16>(); | |
| emut.remove::<C17>(); | |
| emut.remove::<C18>(); | |
| emut.remove::<C19>(); | |
| emut.remove::<C20>(); | |
| emut.remove::<C21>(); | |
| emut.remove::<C22>(); | |
| emut.remove::<C23>(); | |
| emut.remove::<C24>(); | |
| emut.remove::<C25>(); | |
| emut.remove::<C26>(); | |
| emut.remove::<C27>(); | |
| emut.remove::<C28>(); | |
| emut.remove::<C29>(); | |
| emut.remove::<C30>(); | |
| emut.remove::<C31>(); | |
| emut.remove::<C32>(); | |
| } | |
| cmdqueue.apply(&mut world); | |
| count += 1; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| print_result("bevy_add_remove_cmd_32_components", start.elapsed(), | |
| 2 * 32 * count * entities.len() as u32); | |
| } | |
| fn create_delete_empty() { | |
| let mut world = World::new(); | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| let mut interval = 0; | |
| loop { | |
| let e = world.spawn_empty(); | |
| e.despawn(); | |
| count += 1; | |
| interval += 1; | |
| if interval == 25 { | |
| interval = 0; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| } | |
| print_result("bevy_create_delete_empty", start.elapsed(), | |
| 2 * count); | |
| } | |
| fn create_delete_tree(width : u32, depth : u32) { | |
| let mut world = World::new(); | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| let mut interval = 0; | |
| loop { | |
| let root = world.spawn_empty().id(); | |
| let mut cur = root; | |
| for _ in 0..depth { | |
| for _ in 0..width - 1 { | |
| let child = world.spawn_empty().id(); | |
| world.entity_mut(cur).add_child(child); | |
| } | |
| let child = world.spawn_empty().id(); | |
| world.entity_mut(cur).add_child(child); | |
| cur = child; | |
| } | |
| world.entity_mut(root).despawn(); | |
| count += 1; | |
| interval += 1; | |
| if interval == 25 { | |
| interval = 0; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| } | |
| let mut duration = start.elapsed().as_nanos() as f64; | |
| duration /= count as f64; | |
| duration /= width as f64; | |
| println!("bevy_create_delete_tree_w{:?}_d{:?} {:.2}", width, depth, duration); | |
| } | |
| fn flip_coin() -> bool { | |
| rand::random::<bool>() | |
| } | |
| fn query_foreach_rnd_n_tags_1_term(name : &str, t_count : u32) { | |
| let mut world = World::new(); | |
| for _ in 0..65536 { | |
| let mut e = world.spawn_empty(); | |
| if t_count >= 1 { | |
| if flip_coin() { | |
| e.insert(T1()); | |
| } | |
| } | |
| if t_count >= 2 { | |
| if flip_coin() { | |
| e.insert(T2()); | |
| } | |
| } | |
| if t_count >= 3 { | |
| if flip_coin() { | |
| e.insert(T3()); | |
| } | |
| } | |
| if t_count >= 4 { | |
| if flip_coin() { | |
| e.insert(T4()); | |
| } | |
| } | |
| if t_count >= 5 { | |
| if flip_coin() { | |
| e.insert(T5()); | |
| } | |
| } | |
| if t_count >= 6 { | |
| if flip_coin() { | |
| e.insert(T6()); | |
| } | |
| } | |
| if t_count >= 7 { | |
| if flip_coin() { | |
| e.insert(T7()); | |
| } | |
| } | |
| if t_count >= 8 { | |
| if flip_coin() { | |
| e.insert(T8()); | |
| } | |
| } | |
| if t_count >= 9 { | |
| if flip_coin() { | |
| e.insert(T9()); | |
| } | |
| } | |
| if t_count >= 10 { | |
| if flip_coin() { | |
| e.insert(T10()); | |
| } | |
| } | |
| if t_count >= 11 { | |
| if flip_coin() { | |
| e.insert(T11()); | |
| } | |
| } | |
| if t_count >= 12 { | |
| if flip_coin() { | |
| e.insert(T12()); | |
| } | |
| } | |
| if t_count >= 13 { | |
| if flip_coin() { | |
| e.insert(T13()); | |
| } | |
| } | |
| if t_count >= 14 { | |
| if flip_coin() { | |
| e.insert(T14()); | |
| } | |
| } | |
| if t_count >= 15 { | |
| if flip_coin() { | |
| e.insert(T15()); | |
| } | |
| } | |
| if t_count >= 16 { | |
| if flip_coin() { | |
| e.insert(T16()); | |
| } | |
| } | |
| } | |
| let mut q = world.query::<(Entity, &T1)>(); | |
| let mut result : u64 = 0; | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| let mut interval = 0; | |
| loop { | |
| q.iter(&world).for_each(|(e, _t1)| { | |
| result += e.to_bits(); | |
| }); | |
| count += 1; | |
| interval += 1; | |
| if interval == 25 { | |
| interval = 0; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| } | |
| print_result(name, start.elapsed(), count); | |
| println!("result {:?}", result); | |
| } | |
| fn query_foreach_rnd_n_tags_4_terms(name : &str, t_count : u32) { | |
| let mut world = World::new(); | |
| for _ in 0..65536 { | |
| let mut e = world.spawn_empty(); | |
| if t_count >= 1 { | |
| if flip_coin() { | |
| e.insert(T1()); | |
| } | |
| } | |
| if t_count >= 2 { | |
| if flip_coin() { | |
| e.insert(T2()); | |
| } | |
| } | |
| if t_count >= 3 { | |
| if flip_coin() { | |
| e.insert(T3()); | |
| } | |
| } | |
| if t_count >= 4 { | |
| if flip_coin() { | |
| e.insert(T4()); | |
| } | |
| } | |
| if t_count >= 5 { | |
| if flip_coin() { | |
| e.insert(T5()); | |
| } | |
| } | |
| if t_count >= 6 { | |
| if flip_coin() { | |
| e.insert(T6()); | |
| } | |
| } | |
| if t_count >= 7 { | |
| if flip_coin() { | |
| e.insert(T7()); | |
| } | |
| } | |
| if t_count >= 8 { | |
| if flip_coin() { | |
| e.insert(T8()); | |
| } | |
| } | |
| if t_count >= 9 { | |
| if flip_coin() { | |
| e.insert(T9()); | |
| } | |
| } | |
| if t_count >= 10 { | |
| if flip_coin() { | |
| e.insert(T10()); | |
| } | |
| } | |
| if t_count >= 11 { | |
| if flip_coin() { | |
| e.insert(T11()); | |
| } | |
| } | |
| if t_count >= 12 { | |
| if flip_coin() { | |
| e.insert(T12()); | |
| } | |
| } | |
| if t_count >= 13 { | |
| if flip_coin() { | |
| e.insert(T13()); | |
| } | |
| } | |
| if t_count >= 14 { | |
| if flip_coin() { | |
| e.insert(T14()); | |
| } | |
| } | |
| if t_count >= 15 { | |
| if flip_coin() { | |
| e.insert(T15()); | |
| } | |
| } | |
| if t_count >= 16 { | |
| if flip_coin() { | |
| e.insert(T16()); | |
| } | |
| } | |
| } | |
| let mut q = world.query::<(Entity, &T1, &T2, &T3, &T4)>(); | |
| let mut result : u64 = 0; | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| let mut interval = 0; | |
| loop { | |
| q.iter(&world).for_each(|(e, _t1, _t2, _t3, _t4)| { | |
| result += e.to_bits(); | |
| }); | |
| count += 1; | |
| interval += 1; | |
| if interval == 25 { | |
| interval = 0; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| } | |
| print_result(name, start.elapsed(), count); | |
| println!("result {:?}", result); | |
| } | |
| fn query_foreach_rnd_n_tags_8_terms(name : &str, t_count : u32) { | |
| let mut world = World::new(); | |
| for _ in 0..65536 { | |
| let mut e = world.spawn_empty(); | |
| if t_count >= 1 { | |
| if flip_coin() { | |
| e.insert(T1()); | |
| } | |
| } | |
| if t_count >= 2 { | |
| if flip_coin() { | |
| e.insert(T2()); | |
| } | |
| } | |
| if t_count >= 3 { | |
| if flip_coin() { | |
| e.insert(T3()); | |
| } | |
| } | |
| if t_count >= 4 { | |
| if flip_coin() { | |
| e.insert(T4()); | |
| } | |
| } | |
| if t_count >= 5 { | |
| if flip_coin() { | |
| e.insert(T5()); | |
| } | |
| } | |
| if t_count >= 6 { | |
| if flip_coin() { | |
| e.insert(T6()); | |
| } | |
| } | |
| if t_count >= 7 { | |
| if flip_coin() { | |
| e.insert(T7()); | |
| } | |
| } | |
| if t_count >= 8 { | |
| if flip_coin() { | |
| e.insert(T8()); | |
| } | |
| } | |
| if t_count >= 9 { | |
| if flip_coin() { | |
| e.insert(T9()); | |
| } | |
| } | |
| if t_count >= 10 { | |
| if flip_coin() { | |
| e.insert(T10()); | |
| } | |
| } | |
| if t_count >= 11 { | |
| if flip_coin() { | |
| e.insert(T11()); | |
| } | |
| } | |
| if t_count >= 12 { | |
| if flip_coin() { | |
| e.insert(T12()); | |
| } | |
| } | |
| if t_count >= 13 { | |
| if flip_coin() { | |
| e.insert(T13()); | |
| } | |
| } | |
| if t_count >= 14 { | |
| if flip_coin() { | |
| e.insert(T14()); | |
| } | |
| } | |
| if t_count >= 15 { | |
| if flip_coin() { | |
| e.insert(T15()); | |
| } | |
| } | |
| if t_count >= 16 { | |
| if flip_coin() { | |
| e.insert(T16()); | |
| } | |
| } | |
| } | |
| let mut q = world.query::<(Entity, &T1, &T2, &T3, &T4, &T5, &T6, &T7, &T8)>(); | |
| let mut result : u64 = 0; | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| let mut interval = 0; | |
| loop { | |
| q.iter(&world).for_each(|(e, _t1, _t2, _t3, _t4, _t5, _t6, _t7, _t8)| { | |
| result += e.to_bits(); | |
| }); | |
| count += 1; | |
| interval += 1; | |
| if interval == 25 { | |
| interval = 0; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| } | |
| print_result(name, start.elapsed(), count); | |
| println!("result {:?}", result); | |
| } | |
| fn query_foreach_rnd_n_comps_1_term(name : &str, t_count : u32) { | |
| let mut world = World::new(); | |
| for _ in 0..65536 { | |
| let mut e = world.spawn_empty(); | |
| if t_count >= 1 { | |
| if flip_coin() { | |
| e.insert(C1(10.0)); | |
| } | |
| } | |
| if t_count >= 2 { | |
| if flip_coin() { | |
| e.insert(C2(10.0)); | |
| } | |
| } | |
| if t_count >= 3 { | |
| if flip_coin() { | |
| e.insert(C3(10.0)); | |
| } | |
| } | |
| if t_count >= 4 { | |
| if flip_coin() { | |
| e.insert(C4(10.0)); | |
| } | |
| } | |
| if t_count >= 5 { | |
| if flip_coin() { | |
| e.insert(C5(10.0)); | |
| } | |
| } | |
| if t_count >= 6 { | |
| if flip_coin() { | |
| e.insert(C6(10.0)); | |
| } | |
| } | |
| if t_count >= 7 { | |
| if flip_coin() { | |
| e.insert(C7(10.0)); | |
| } | |
| } | |
| if t_count >= 8 { | |
| if flip_coin() { | |
| e.insert(C8(10.0)); | |
| } | |
| } | |
| if t_count >= 9 { | |
| if flip_coin() { | |
| e.insert(C9(10.0)); | |
| } | |
| } | |
| if t_count >= 10 { | |
| if flip_coin() { | |
| e.insert(C10(10.0)); | |
| } | |
| } | |
| if t_count >= 11 { | |
| if flip_coin() { | |
| e.insert(C11(10.0)); | |
| } | |
| } | |
| if t_count >= 12 { | |
| if flip_coin() { | |
| e.insert(C12(10.0)); | |
| } | |
| } | |
| if t_count >= 13 { | |
| if flip_coin() { | |
| e.insert(C13(10.0)); | |
| } | |
| } | |
| if t_count >= 14 { | |
| if flip_coin() { | |
| e.insert(C14(10.0)); | |
| } | |
| } | |
| if t_count >= 15 { | |
| if flip_coin() { | |
| e.insert(C15(10.0)); | |
| } | |
| } | |
| if t_count >= 16 { | |
| if flip_coin() { | |
| e.insert(C16(10.0)); | |
| } | |
| } | |
| } | |
| let mut q = world.query::<(Entity, &C1)>(); | |
| let mut result : u64 = 0; | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| let mut interval = 0; | |
| loop { | |
| q.iter(&world).for_each(|(e, _t1)| { | |
| result += e.to_bits(); | |
| result += _t1.0 as u64; | |
| }); | |
| count += 1; | |
| interval += 1; | |
| if interval == 25 { | |
| interval = 0; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| } | |
| print_result(name, start.elapsed(), count); | |
| println!("result {:?}", result); | |
| } | |
| fn query_foreach_rnd_n_comps_4_terms(name : &str, t_count : u32) { | |
| let mut world = World::new(); | |
| for _ in 0..65536 { | |
| let mut e = world.spawn_empty(); | |
| if t_count >= 1 { | |
| if flip_coin() { | |
| e.insert(C1(10.0)); | |
| } | |
| } | |
| if t_count >= 2 { | |
| if flip_coin() { | |
| e.insert(C2(10.0)); | |
| } | |
| } | |
| if t_count >= 3 { | |
| if flip_coin() { | |
| e.insert(C3(10.0)); | |
| } | |
| } | |
| if t_count >= 4 { | |
| if flip_coin() { | |
| e.insert(C4(10.0)); | |
| } | |
| } | |
| if t_count >= 5 { | |
| if flip_coin() { | |
| e.insert(C5(10.0)); | |
| } | |
| } | |
| if t_count >= 6 { | |
| if flip_coin() { | |
| e.insert(C6(10.0)); | |
| } | |
| } | |
| if t_count >= 7 { | |
| if flip_coin() { | |
| e.insert(C7(10.0)); | |
| } | |
| } | |
| if t_count >= 8 { | |
| if flip_coin() { | |
| e.insert(C8(10.0)); | |
| } | |
| } | |
| if t_count >= 9 { | |
| if flip_coin() { | |
| e.insert(C9(10.0)); | |
| } | |
| } | |
| if t_count >= 10 { | |
| if flip_coin() { | |
| e.insert(C10(10.0)); | |
| } | |
| } | |
| if t_count >= 11 { | |
| if flip_coin() { | |
| e.insert(C11(10.0)); | |
| } | |
| } | |
| if t_count >= 12 { | |
| if flip_coin() { | |
| e.insert(C12(10.0)); | |
| } | |
| } | |
| if t_count >= 13 { | |
| if flip_coin() { | |
| e.insert(C13(10.0)); | |
| } | |
| } | |
| if t_count >= 14 { | |
| if flip_coin() { | |
| e.insert(C14(10.0)); | |
| } | |
| } | |
| if t_count >= 15 { | |
| if flip_coin() { | |
| e.insert(C15(10.0)); | |
| } | |
| } | |
| if t_count >= 16 { | |
| if flip_coin() { | |
| e.insert(C16(10.0)); | |
| } | |
| } | |
| } | |
| let mut q = world.query::<(Entity, &C1, &C2, &C3, &C4)>(); | |
| let mut result : u64 = 0; | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| let mut interval = 0; | |
| loop { | |
| q.iter(&world).for_each(|(e, _t1, _t2, _t3, _t4)| { | |
| result += e.to_bits(); | |
| result += _t1.0 as u64; | |
| result += _t2.0 as u64; | |
| result += _t3.0 as u64; | |
| result += _t4.0 as u64; | |
| }); | |
| count += 1; | |
| interval += 1; | |
| if interval == 25 { | |
| interval = 0; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| } | |
| print_result(name, start.elapsed(), count); | |
| println!("result {:?}", result); | |
| } | |
| fn query_foreach_rnd_n_comps_8_terms(name : &str, t_count : u32) { | |
| let mut world = World::new(); | |
| for _ in 0..65536 { | |
| let mut e = world.spawn_empty(); | |
| if t_count >= 1 { | |
| if flip_coin() { | |
| e.insert(C1(10.0)); | |
| } | |
| } | |
| if t_count >= 2 { | |
| if flip_coin() { | |
| e.insert(C2(10.0)); | |
| } | |
| } | |
| if t_count >= 3 { | |
| if flip_coin() { | |
| e.insert(C3(10.0)); | |
| } | |
| } | |
| if t_count >= 4 { | |
| if flip_coin() { | |
| e.insert(C4(10.0)); | |
| } | |
| } | |
| if t_count >= 5 { | |
| if flip_coin() { | |
| e.insert(C5(10.0)); | |
| } | |
| } | |
| if t_count >= 6 { | |
| if flip_coin() { | |
| e.insert(C6(10.0)); | |
| } | |
| } | |
| if t_count >= 7 { | |
| if flip_coin() { | |
| e.insert(C7(10.0)); | |
| } | |
| } | |
| if t_count >= 8 { | |
| if flip_coin() { | |
| e.insert(C8(10.0)); | |
| } | |
| } | |
| if t_count >= 9 { | |
| if flip_coin() { | |
| e.insert(C9(10.0)); | |
| } | |
| } | |
| if t_count >= 10 { | |
| if flip_coin() { | |
| e.insert(C10(10.0)); | |
| } | |
| } | |
| if t_count >= 11 { | |
| if flip_coin() { | |
| e.insert(C11(10.0)); | |
| } | |
| } | |
| if t_count >= 12 { | |
| if flip_coin() { | |
| e.insert(C12(10.0)); | |
| } | |
| } | |
| if t_count >= 13 { | |
| if flip_coin() { | |
| e.insert(C13(10.0)); | |
| } | |
| } | |
| if t_count >= 14 { | |
| if flip_coin() { | |
| e.insert(C14(10.0)); | |
| } | |
| } | |
| if t_count >= 15 { | |
| if flip_coin() { | |
| e.insert(C15(10.0)); | |
| } | |
| } | |
| if t_count >= 16 { | |
| if flip_coin() { | |
| e.insert(C16(10.0)); | |
| } | |
| } | |
| } | |
| let mut q = world.query::<(Entity, &C1, &C2, &C3, &C4, &C5, &C6, &C7, &C8)>(); | |
| let mut result : u64 = 0; | |
| let start = Instant::now(); | |
| let mut count = 0; | |
| let mut interval = 0; | |
| loop { | |
| q.iter(&world).for_each(|(e, _t1, _t2, _t3, _t4, _t5, _t6, _t7, _t8)| { | |
| result += e.to_bits(); | |
| result += _t1.0 as u64; | |
| result += _t2.0 as u64; | |
| result += _t3.0 as u64; | |
| result += _t4.0 as u64; | |
| result += _t5.0 as u64; | |
| result += _t6.0 as u64; | |
| result += _t7.0 as u64; | |
| result += _t8.0 as u64; | |
| }); | |
| count += 1; | |
| interval += 1; | |
| if interval == 25 { | |
| interval = 0; | |
| let spent = start.elapsed(); | |
| if spent.as_secs() >= 1 { | |
| break; | |
| } | |
| } | |
| } | |
| print_result(name, start.elapsed(), count); | |
| println!("result {:?}", result); | |
| } | |
| fn main() { | |
| get_not_found(); | |
| get_1(); | |
| add_remove_1_tags(); | |
| add_remove_2_tags(); | |
| add_remove_16_tags(); | |
| add_remove_32_tags(); | |
| add_remove_1_components(); | |
| add_remove_2_components(); | |
| add_remove_16_components(); | |
| add_remove_32_components(); | |
| add_existing_1_tag(); | |
| insert(); | |
| get_mut(); | |
| get_mut_not_found(); | |
| add_remove_cmd_1_tags(); | |
| add_remove_cmd_16_tags(); | |
| add_remove_cmd_32_tags(); | |
| add_remove_cmd_1_components(); | |
| add_remove_cmd_16_components(); | |
| add_remove_cmd_32_components(); | |
| create_delete_empty(); | |
| create_delete_tree(1, 1); | |
| create_delete_tree(1, 10); | |
| create_delete_tree(1, 100); | |
| create_delete_tree(1, 1000); | |
| create_delete_tree(10, 1); | |
| create_delete_tree(10, 10); | |
| create_delete_tree(10, 100); | |
| create_delete_tree(10, 1000); | |
| create_delete_tree(100, 1); | |
| create_delete_tree(100, 10); | |
| create_delete_tree(100, 100); | |
| create_delete_tree(100, 1000); | |
| create_delete_tree(1000, 1); | |
| create_delete_tree(1000, 10); | |
| create_delete_tree(1000, 100); | |
| create_delete_tree(1000, 1000); | |
| query_foreach_rnd_n_tags_1_term("bevy_foreach_rnd_6_tags_1_term", 6); | |
| query_foreach_rnd_n_tags_4_terms("bevy_foreach_rnd_6_tags_4_term", 6); | |
| query_foreach_rnd_n_tags_1_term("bevy_foreach_rnd_8_tags_1_term", 8); | |
| query_foreach_rnd_n_tags_4_terms("bevy_foreach_rnd_8_tags_4_term", 8); | |
| query_foreach_rnd_n_tags_1_term("bevy_foreach_rnd_10_tags_1_term", 10); | |
| query_foreach_rnd_n_tags_4_terms("bevy_foreach_rnd_10_tags_4_term", 10); | |
| query_foreach_rnd_n_tags_8_terms("bevy_foreach_rnd_10_tags_8_term", 10); | |
| query_foreach_rnd_n_tags_1_term("bevy_foreach_rnd_16_tags_1_term", 16); | |
| query_foreach_rnd_n_tags_4_terms("bevy_foreach_rnd_16_tags_4_term", 16); | |
| query_foreach_rnd_n_tags_8_terms("bevy_foreach_rnd_16_tags_8_term", 16); | |
| query_foreach_rnd_n_comps_1_term("bevy_foreach_rnd_6_comps_1_term", 6); | |
| query_foreach_rnd_n_comps_4_terms("bevy_foreach_rnd_6_comps_4_term", 6); | |
| query_foreach_rnd_n_comps_1_term("bevy_foreach_rnd_8_comps_1_term", 8); | |
| query_foreach_rnd_n_comps_4_terms("bevy_foreach_rnd_8_comps_4_term", 8); | |
| query_foreach_rnd_n_comps_1_term("bevy_foreach_rnd_10_comps_1_term", 10); | |
| query_foreach_rnd_n_comps_4_terms("bevy_foreach_rnd_10_comps_4_term", 10); | |
| query_foreach_rnd_n_comps_8_terms("bevy_foreach_rnd_10_comps_8_term", 10); | |
| query_foreach_rnd_n_comps_1_term("bevy_foreach_rnd_16_comps_1_term", 16); | |
| query_foreach_rnd_n_comps_4_terms("bevy_foreach_rnd_16_comps_4_term", 16); | |
| query_foreach_rnd_n_comps_8_terms("bevy_foreach_rnd_16_comps_8_term", 16); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment