rust/hwphysics/benches/ecs_bench.rs
changeset 15940 ea370bfda705
parent 15935 cd3d16905e0e
child 15943 feb7a76915d2
equal deleted inserted replaced
15939:4a8e6f9d5133 15940:ea370bfda705
     1 use criterion::{black_box, criterion_group, criterion_main, Criterion};
     1 use criterion::{black_box, criterion_group, criterion_main, Criterion};
     2 use hwphysics::{
     2 use hwphysics::{common::GearId, data::GearDataManager};
     3     common::GearId,
     3 
     4     data::{GearDataManager}
     4 #[derive(Clone, Copy, Default)]
     5 };
     5 struct P {
       
     6     position: u64,
       
     7 }
     6 
     8 
     7 #[derive(Clone, Copy, Default)]
     9 #[derive(Clone, Copy, Default)]
     8 struct V {
    10 struct V {
     9     position: u64,
    11     velocity: u64,
    10     velocity: u64
       
    11 }
    12 }
    12 
    13 
    13 pub fn benchmark(c: &mut Criterion) {
    14 #[derive(Clone, Copy, Default)]
    14     const SIZE: usize = 4 * 1024;
    15 struct Pv {
    15     let mut items = [V::default(); SIZE];
    16     position: u64,
       
    17     velocity: u64,
       
    18 }
    16 
    19 
    17     c.bench_function("array run", |b| b.iter(|| {
    20 const SIZE: usize = 4 * 1024;
    18         for item in &mut items {
       
    19             item.velocity += black_box(item.position);
       
    20         }
       
    21     }));
       
    22 
    21 
       
    22 pub fn array_run(c: &mut Criterion) {
       
    23     let mut items = [Pv::default(); SIZE];
       
    24 
       
    25     c.bench_function("array run", |b| {
       
    26         b.iter(|| {
       
    27             for item in &mut items {
       
    28                 item.velocity += black_box(item.position);
       
    29             }
       
    30         })
       
    31     });
       
    32 }
       
    33 
       
    34 pub fn component_run(c: &mut Criterion) {
    23     let mut manager = GearDataManager::new();
    35     let mut manager = GearDataManager::new();
    24     manager.register::<V>();
    36     manager.register::<Pv>();
    25     for i in 1..=items.len() {
    37     for i in 1..=SIZE {
    26         let gear_id = GearId::new(i as u16).unwrap();
    38         let gear_id = GearId::new(i as u16).unwrap();
    27         manager.add(gear_id, &items[i - 1]);
    39         manager.add(gear_id, &Pv::default());
    28     }
    40     }
    29 
    41 
    30     c.bench_function("component run", |b| b.iter(|| {
    42     c.bench_function("component run", |b| {
    31         manager.iter().run(|(item,): (&mut V,)| item.velocity += black_box(item.position) );
    43         b.iter(|| {
    32     }));
    44             manager
       
    45                 .iter()
       
    46                 .run(|(item,): (&mut Pv,)| item.velocity += black_box(item.position));
       
    47         })
       
    48     });
    33 }
    49 }
    34 
    50 
    35 criterion_group!(benches, benchmark);
    51 pub fn component_add_remove(c: &mut Criterion) {
       
    52     let mut manager = GearDataManager::new();
       
    53     let mut gears1 = vec![];
       
    54     let mut gears2 = vec![];
       
    55 
       
    56     manager.register::<P>();
       
    57     manager.register::<V>();
       
    58 
       
    59     for i in 1..=SIZE {
       
    60         let gear_id = GearId::new(i as u16).unwrap();
       
    61         manager.add(gear_id, &P::default());
       
    62         if i % 2 == 0 {
       
    63             manager.add(gear_id, &V::default());
       
    64             gears1.push(gear_id);
       
    65         } else {
       
    66             gears2.push(gear_id);
       
    67         }
       
    68     }
       
    69 
       
    70     c.bench_function("component add/remove", |b| {
       
    71         b.iter(|| {
       
    72             for id in &gears2 {
       
    73                 manager.add(*id, &V::default());
       
    74             }
       
    75             for id in &gears1 {
       
    76                 manager.remove::<V>(*id);
       
    77             }
       
    78             std::mem::swap(&mut gears1, &mut gears2);
       
    79         })
       
    80     });
       
    81 }
       
    82 
       
    83 criterion_group!(benches, array_run, component_run, component_add_remove);
    36 criterion_main!(benches);
    84 criterion_main!(benches);