rust/hwphysics/benches/ecs_bench.rs
author alfadur
Thu, 23 Mar 2023 23:41:26 +0300
changeset 15935 cd3d16905e0e
child 15940 ea370bfda705
permissions -rw-r--r--
add basic ECS benchmark
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15935
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
     1
use criterion::{black_box, criterion_group, criterion_main, Criterion};
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
     2
use hwphysics::{
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
     3
    common::GearId,
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
     4
    data::{GearDataManager}
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
     5
};
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
     6
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
     7
#[derive(Clone, Copy, Default)]
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
     8
struct V {
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
     9
    position: u64,
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    10
    velocity: u64
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    11
}
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    12
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    13
pub fn benchmark(c: &mut Criterion) {
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    14
    const SIZE: usize = 4 * 1024;
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    15
    let mut items = [V::default(); SIZE];
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    16
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    17
    c.bench_function("array run", |b| b.iter(|| {
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    18
        for item in &mut items {
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    19
            item.velocity += black_box(item.position);
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    20
        }
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    21
    }));
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    22
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    23
    let mut manager = GearDataManager::new();
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    24
    manager.register::<V>();
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    25
    for i in 1..=items.len() {
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    26
        let gear_id = GearId::new(i as u16).unwrap();
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    27
        manager.add(gear_id, &items[i - 1]);
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    28
    }
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    29
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    30
    c.bench_function("component run", |b| b.iter(|| {
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    31
        manager.iter().run(|(item,): (&mut V,)| item.velocity += black_box(item.position) );
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    32
    }));
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    33
}
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    34
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    35
criterion_group!(benches, benchmark);
cd3d16905e0e add basic ECS benchmark
alfadur
parents:
diff changeset
    36
criterion_main!(benches);