From 4ff4761813fddc3fae66af3063d31caa79a16a32 Mon Sep 17 00:00:00 2001 From: Zakarum Date: Wed, 19 Jan 2022 02:38:42 +0300 Subject: [PATCH] Add Edict ECS to the suite --- Cargo.toml | 1 + benches/benchmarks.rs | 16 +++++++++++++++ src/edict/add_remove.rs | 26 ++++++++++++++++++++++++ src/edict/frag_iter.rs | 29 +++++++++++++++++++++++++++ src/edict/mod.rs | 4 ++++ src/edict/simple_insert.rs | 39 ++++++++++++++++++++++++++++++++++++ src/edict/simple_iter.rs | 41 ++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 8 files changed, 157 insertions(+) create mode 100644 src/edict/add_remove.rs create mode 100644 src/edict/frag_iter.rs create mode 100644 src/edict/mod.rs create mode 100644 src/edict/simple_insert.rs create mode 100644 src/edict/simple_iter.rs diff --git a/Cargo.toml b/Cargo.toml index 7ffdf08c..5156ca0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ serde = { version = "1.0", features = ["derive"] } shipyard = "0.5.0" specs = {version = "0.16.1", features = ["serde"] } specs-derive = "0.4.1" +edict = { version = "0.0.3" } [dev-dependencies] criterion = "0.3" diff --git a/benches/benchmarks.rs b/benches/benchmarks.rs index 63aa01aa..66c3551e 100644 --- a/benches/benchmarks.rs +++ b/benches/benchmarks.rs @@ -27,6 +27,10 @@ fn bench_simple_insert(c: &mut Criterion) { let mut bench = specs::simple_insert::Benchmark::new(); b.iter(move || bench.run()); }); + group.bench_function("edict", |b| { + let mut bench = edict::simple_insert::Benchmark::new(); + b.iter(move || bench.run()); + }); } fn bench_simple_iter(c: &mut Criterion) { @@ -59,6 +63,10 @@ fn bench_simple_iter(c: &mut Criterion) { let mut bench = specs::simple_iter::Benchmark::new(); b.iter(move || bench.run()); }); + group.bench_function("edict", |b| { + let mut bench = edict::simple_iter::Benchmark::new(); + b.iter(move || bench.run()); + }); } fn bench_frag_iter_bc(c: &mut Criterion) { @@ -87,6 +95,10 @@ fn bench_frag_iter_bc(c: &mut Criterion) { let mut bench = specs::frag_iter::Benchmark::new(); b.iter(move || bench.run()); }); + group.bench_function("edict", |b| { + let mut bench = edict::frag_iter::Benchmark::new(); + b.iter(move || bench.run()); + }); } fn bench_schedule(c: &mut Criterion) { @@ -171,6 +183,10 @@ fn bench_add_remove(c: &mut Criterion) { let mut bench = bevy::add_remove::Benchmark::new(); b.iter(move || bench.run()); }); + group.bench_function("edict", |b| { + let mut bench = edict::add_remove::Benchmark::new(); + b.iter(move || bench.run()); + }); } fn bench_serialize_text(c: &mut Criterion) { diff --git a/src/edict/add_remove.rs b/src/edict/add_remove.rs new file mode 100644 index 00000000..1b7eb085 --- /dev/null +++ b/src/edict/add_remove.rs @@ -0,0 +1,26 @@ +use edict::prelude::*; + +struct A(f32); +struct B(f32); + +pub struct Benchmark(World, Vec); + +impl Benchmark { + pub fn new() -> Self { + let mut world = World::new(); + + let entities = (0..10_000).map(|_| world.spawn((A(0.0),))).collect(); + + Self(world, entities) + } + + pub fn run(&mut self) { + for entity in &self.1 { + self.0.insert(entity, B(0.0)); + } + + for entity in &self.1 { + let _ = self.0.remove::(entity); + } + } +} diff --git a/src/edict/frag_iter.rs b/src/edict/frag_iter.rs new file mode 100644 index 00000000..1a1573da --- /dev/null +++ b/src/edict/frag_iter.rs @@ -0,0 +1,29 @@ +use edict::prelude::*; + +macro_rules! create_entities { + ($world:ident; $entities:ident; $( $variants:ident ),*) => { + $( + struct $variants(f32); + $entities.extend($world.spawn_batch((0..20).map(|_| ($variants(0.0), Data(1.0))))); + )* + }; +} + +struct Data(f32); + +pub struct Benchmark(World, Vec); + +impl Benchmark { + pub fn new() -> Self { + let mut world = World::default(); + let mut entities = Vec::new(); + + create_entities!(world; entities; A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z); + + Self(world, entities) + } + + pub fn run(&mut self) { + self.0.for_each_mut::<&mut Data, _>(|data| data.0 *= 2.0); + } +} diff --git a/src/edict/mod.rs b/src/edict/mod.rs new file mode 100644 index 00000000..8873bb5b --- /dev/null +++ b/src/edict/mod.rs @@ -0,0 +1,4 @@ +pub mod add_remove; +pub mod frag_iter; +pub mod simple_insert; +pub mod simple_iter; diff --git a/src/edict/simple_insert.rs b/src/edict/simple_insert.rs new file mode 100644 index 00000000..263ea939 --- /dev/null +++ b/src/edict/simple_insert.rs @@ -0,0 +1,39 @@ +use cgmath::*; +use edict::prelude::*; + +#[derive(Copy, Clone)] +struct Transform(Matrix4); + +#[derive(Copy, Clone)] +struct Position(Vector3); + +#[derive(Copy, Clone)] +struct Rotation(Vector3); + +#[derive(Copy, Clone)] +struct Velocity(Vector3); + +pub struct Benchmark { + entities: Vec, +} + +impl Benchmark { + pub fn new() -> Self { + Benchmark { + entities: Vec::new(), + } + } + + pub fn run(&mut self) { + let mut world = World::new(); + + self.entities.extend(world.spawn_batch((0..10_000).map(|_| { + ( + Transform(Matrix4::from_scale(1.0)), + Position(Vector3::unit_x()), + Rotation(Vector3::unit_x()), + Velocity(Vector3::unit_x()), + ) + }))); + } +} diff --git a/src/edict/simple_iter.rs b/src/edict/simple_iter.rs new file mode 100644 index 00000000..11f2f554 --- /dev/null +++ b/src/edict/simple_iter.rs @@ -0,0 +1,41 @@ +use cgmath::*; +use edict::prelude::*; + +#[derive(Copy, Clone)] +struct Transform(Matrix4); + +#[derive(Copy, Clone)] +struct Position(Vector3); + +#[derive(Copy, Clone)] +struct Rotation(Vector3); + +#[derive(Copy, Clone)] +struct Velocity(Vector3); + +pub struct Benchmark(World, Vec); + +impl Benchmark { + pub fn new() -> Self { + let mut world = World::new(); + let entities = world + .spawn_batch((0..10_000).map(|_| { + ( + Transform(Matrix4::from_scale(1.0)), + Position(Vector3::unit_x()), + Rotation(Vector3::unit_x()), + Velocity(Vector3::unit_x()), + ) + })) + .collect(); + + Self(world, entities) + } + + pub fn run(&mut self) { + self.0 + .for_each_mut::<(&Velocity, &mut Position), _>(|(velocity, position)| { + position.0 += velocity.0; + }) + } +} diff --git a/src/lib.rs b/src/lib.rs index 4517bb86..b3b8f2e7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,3 +7,4 @@ pub mod legion_packed; pub mod planck_ecs; pub mod shipyard; pub mod specs; +pub mod edict; \ No newline at end of file