From a83ed3261a1f7bd4d1c0e6e7cb83b0c735a77123 Mon Sep 17 00:00:00 2001 From: alice <166900055+alicesaidhi@users.noreply.github.com> Date: Tue, 16 Jul 2024 00:12:46 +0200 Subject: [PATCH] add query --- benches/general.luau | 157 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 155 insertions(+), 2 deletions(-) diff --git a/benches/general.luau b/benches/general.luau index dff4a98..8fc9c8b 100644 --- a/benches/general.luau +++ b/benches/general.luau @@ -9,7 +9,7 @@ local function TITLE(s: string) print(testkit.color.white(s)) end -local N = 2^18 +local N = 2^17 local pair = jecs.pair @@ -54,6 +54,12 @@ do TITLE "set" world:set(entities[i], A, 2) end end) + + BENCH("remove", function() + for i = 1, START(N) do + world:remove(entities[i], A) + end + end) end do TITLE "get" @@ -94,4 +100,151 @@ do TITLE "get" world:get(entities[i], A, B, C, D) end end) -end \ No newline at end of file +end + +--- this benchmark is used to view how fragmentation affects query performance +--- we use this by determining how many entities should fit per arcehtype, instead +--- of creating x amount of archetypes. this would scale better with any amount of +--- entities. +do TITLE(`query {N} entities`) + + local function view_bench(world: jecs.WorldShim, A: jecs.Entity, B: jecs.Entity, C: jecs.Entity, D: jecs.Entity) + + BENCH("1 component", function() + for id in world:query(A) do + + end + end) + + BENCH("2 component", function() + for id in world:query(A, B) do + + end + end) + + BENCH("3 component", function() + for id in world:query(A, B, C) do + + end + end) + + BENCH("4 component", function() + for id in world:query(A, B, C, D) do + + end + end) + + end + + do TITLE "2048 entities per archetype" + local world = jecs.World.new() + local A, B, C, D = world:entity(), world:entity(), world:entity(), world:entity() + + for i = 1, N, 2048 do + local ct = world:entity() + for j = 1, 2048 do + local id = world:entity() + world:set(id, A, true) + world:set(id, B, true) + world:set(id, C, true) + world:set(id, D, true) + world:set(id, ct, true) + end + end + + view_bench(world, A, B, C, D) + end + + do TITLE "512 entities per archetype" + local world = jecs.World.new() + local A, B, C, D = world:entity(), world:entity(), world:entity(), world:entity() + + for i = 1, N, 512 do + local ct = world:entity() + for j = 1, 512 do + local id = world:entity() + world:set(id, A, true) + world:set(id, B, true) + world:set(id, C, true) + world:set(id, D, true) + world:set(id, ct, true) + end + end + + view_bench(world, A, B, C, D) + end + + do TITLE "32 entities per archetype" + local world = jecs.World.new() + local A, B, C, D = world:entity(), world:entity(), world:entity(), world:entity() + + for i = 1, N, 32 do + local ct = world:entity() + for j = 1, 32 do + local id = world:entity() + world:set(id, A, true) + world:set(id, B, true) + world:set(id, C, true) + world:set(id, D, true) + world:set(id, ct, true) + end + end + + view_bench(world, A, B, C, D) + end + + do TITLE "16 entities per archetype" + local world = jecs.World.new() + local A, B, C, D = world:entity(), world:entity(), world:entity(), world:entity() + + for i = 1, N, 16 do + local ct = world:entity() + for j = 1, 16 do + local id = world:entity() + world:set(id, A, true) + world:set(id, B, true) + world:set(id, C, true) + world:set(id, D, true) + world:set(id, ct, true) + end + end + + view_bench(world, A, B, C, D) + end + + do TITLE "8 entity per archetype" + local world = jecs.World.new() + local A, B, C, D = world:entity(), world:entity(), world:entity(), world:entity() + + for i = 1, N, 8 do + local ct = world:entity() + for j = 1, 8 do + local id = world:entity() + world:set(id, A, true) + world:set(id, B, true) + world:set(id, C, true) + world:set(id, D, true) + world:set(id, ct, true) + end + end + + view_bench(world, A, B, C, D) + end + + do TITLE "archetype per entity" + local world = jecs.World.new() + local A, B, C, D = world:entity(), world:entity(), world:entity(), world:entity() + + for i = 1, N do + local id = world:entity() + world:set(id, A, true) + world:set(id, B, true) + world:set(id, C, true) + world:set(id, D, true) + world:set(id, pair(A, id)) + end + + view_bench(world, A, B, C, D) + end + +end