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); |