15940
|
1 |
use criterion::{black_box, criterion_group, criterion_main, Criterion};
|
|
2 |
use hwphysics::{common::GearId, data::GearDataManager};
|
|
3 |
|
|
4 |
#[derive(Clone, Copy, Default)]
|
|
5 |
struct P {
|
|
6 |
position: u64,
|
|
7 |
}
|
|
8 |
|
|
9 |
#[derive(Clone, Copy, Default)]
|
|
10 |
struct V {
|
|
11 |
velocity: u64,
|
|
12 |
}
|
|
13 |
|
|
14 |
#[derive(Clone, Copy, Default)]
|
|
15 |
struct Pv {
|
|
16 |
position: u64,
|
|
17 |
velocity: u64,
|
|
18 |
}
|
|
19 |
|
|
20 |
const SIZE: usize = 4 * 1024;
|
|
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) {
|
|
35 |
let mut manager = GearDataManager::new();
|
|
36 |
manager.register::<Pv>();
|
|
37 |
for i in 1..=SIZE {
|
|
38 |
let gear_id = GearId::new(i as u16).unwrap();
|
|
39 |
manager.add(gear_id, &Pv::default());
|
|
40 |
}
|
|
41 |
|
|
42 |
c.bench_function("component run", |b| {
|
|
43 |
b.iter(|| {
|
|
44 |
manager
|
|
45 |
.iter()
|
|
46 |
.run(|(item,): (&mut Pv,)| item.velocity += black_box(item.position));
|
|
47 |
})
|
|
48 |
});
|
|
49 |
}
|
|
50 |
|
|
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);
|
|
84 |
criterion_main!(benches);
|