|
| 1 | +use std::{alloc::Layout, hint::black_box, ptr::NonNull}; |
| 2 | + |
| 3 | +use benches::bench; |
| 4 | +use bevy_ecs::{ |
| 5 | + change_detection::MaybeLocation, |
| 6 | + component::{ComponentCloneBehavior, ComponentDescriptor, StorageType}, |
| 7 | + prelude::*, |
| 8 | + ptr::OwningPtr, |
| 9 | +}; |
| 10 | +use criterion::{criterion_group, Criterion}; |
| 11 | + |
| 12 | +criterion_group!(benches, get, get_mut, insert_remove); |
| 13 | + |
| 14 | +fn create_world() -> World { |
| 15 | + let mut world = World::new(); |
| 16 | + for _ in 0..500 { |
| 17 | + // SAFETY: Uses zero-sized value, never drops |
| 18 | + unsafe { |
| 19 | + let resource_id = |
| 20 | + world.register_component_with_descriptor(ComponentDescriptor::new_with_layout( |
| 21 | + "", |
| 22 | + StorageType::SparseSet, |
| 23 | + Layout::new::<()>(), |
| 24 | + None, |
| 25 | + true, |
| 26 | + ComponentCloneBehavior::Default, |
| 27 | + None, |
| 28 | + )); |
| 29 | + world.insert_resource_by_id( |
| 30 | + resource_id, |
| 31 | + OwningPtr::new(NonNull::dangling()), |
| 32 | + MaybeLocation::caller(), |
| 33 | + ); |
| 34 | + } |
| 35 | + } |
| 36 | + world |
| 37 | +} |
| 38 | + |
| 39 | +#[derive(Resource)] |
| 40 | +struct R; |
| 41 | + |
| 42 | +pub fn get(criterion: &mut Criterion) { |
| 43 | + let mut world = create_world(); |
| 44 | + world.insert_resource(R); |
| 45 | + criterion.bench_function(bench!("get"), |bencher| { |
| 46 | + bencher.iter(|| world.get_resource::<R>()); |
| 47 | + }); |
| 48 | +} |
| 49 | + |
| 50 | +pub fn get_mut(criterion: &mut Criterion) { |
| 51 | + let mut world = create_world(); |
| 52 | + world.insert_resource(R); |
| 53 | + criterion.bench_function(bench!("get_mut"), |bencher| { |
| 54 | + bencher.iter(|| { |
| 55 | + black_box(world.get_resource_mut::<R>()); |
| 56 | + }); |
| 57 | + }); |
| 58 | +} |
| 59 | + |
| 60 | +pub fn insert_remove(criterion: &mut Criterion) { |
| 61 | + let mut world = create_world(); |
| 62 | + criterion.bench_function(bench!("insert_remove"), |bencher| { |
| 63 | + bencher.iter(|| { |
| 64 | + world.insert_resource(R); |
| 65 | + black_box(&mut world); |
| 66 | + world.remove_resource::<R>() |
| 67 | + }); |
| 68 | + }); |
| 69 | +} |
0 commit comments