jecs/benches/query.luau

247 lines
5 KiB
Text
Raw Normal View History

2024-05-01 12:41:51 +00:00
--!optimize 2
--!native
2024-07-06 21:37:11 +00:00
local testkit = require("@testkit")
2024-05-01 12:41:51 +00:00
local BENCH, START = testkit.benchmark()
local function TITLE(title: string)
print()
print(testkit.color.white(title))
2024-05-01 12:41:51 +00:00
end
2024-07-06 21:37:11 +00:00
local jecs = require("@jecs")
2025-01-14 10:09:18 +00:00
local mirror = require("@mirror")
2024-05-01 12:41:51 +00:00
type i53 = number
do
TITLE(testkit.color.white_underline("Jecs query"))
local ecs = jecs.World.new()
do
TITLE("one component in common")
local function view_bench(world: jecs.World, A: i53, B: i53, C: i53, D: i53, E: i53, F: i53, G: i53, H: i53)
BENCH("1 component", function()
for _ in world:query(A) do
end
end)
BENCH("2 component", function()
2024-07-14 04:35:13 +00:00
for _ in world:query(B, A) do
end
end)
BENCH("4 component", function()
2024-07-14 04:35:13 +00:00
for _ in world:query(D, C, B, A) do
end
end)
BENCH("8 component", function()
2024-07-14 04:35:13 +00:00
for _ in world:query(H, G, F, E, D, C, B, A) do
end
end)
local e = world:entity()
world:set(e, A, true)
world:set(e, B, true)
world:set(e, C, true)
world:set(e, D, true)
world:set(e, E, true)
world:set(e, F, true)
world:set(e, G, true)
world:set(e, H, true)
2024-07-06 21:30:14 +00:00
BENCH("Update Data", function()
for _ = 1, 100 do
world:set(e, A, false)
world:set(e, B, false)
world:set(e, C, false)
world:set(e, D, false)
world:set(e, E, false)
world:set(e, F, false)
world:set(e, G, false)
world:set(e, H, false)
end
end)
end
local D1 = ecs:component()
local D2 = ecs:component()
local D3 = ecs:component()
local D4 = ecs:component()
local D5 = ecs:component()
local D6 = ecs:component()
local D7 = ecs:component()
local D8 = ecs:component()
2024-05-05 13:06:57 +00:00
local function flip()
return math.random() >= 0.15
end
local added = 0
local archetypes = {}
for i = 1, 2 ^ 16 - 2 do
local entity = ecs:entity()
local combination = ""
if flip() then
combination ..= "B"
ecs:set(entity, D2, { value = true })
2024-05-05 13:06:57 +00:00
end
if flip() then
combination ..= "C"
ecs:set(entity, D3, { value = true })
2024-05-05 13:06:57 +00:00
end
if flip() then
combination ..= "D"
ecs:set(entity, D4, { value = true })
2024-05-05 13:06:57 +00:00
end
if flip() then
combination ..= "E"
ecs:set(entity, D5, { value = true })
2024-05-05 13:06:57 +00:00
end
if flip() then
combination ..= "F"
ecs:set(entity, D6, { value = true })
2024-05-05 13:06:57 +00:00
end
if flip() then
combination ..= "G"
ecs:set(entity, D7, { value = true })
2024-05-05 13:06:57 +00:00
end
if flip() then
combination ..= "H"
ecs:set(entity, D8, { value = true })
2024-05-05 13:06:57 +00:00
end
if #combination == 7 then
added += 1
ecs:set(entity, D1, { value = true })
2024-05-05 13:06:57 +00:00
end
archetypes[combination] = true
end
local a = 0
for _ in archetypes do
a += 1
end
view_bench(ecs, D1, D2, D3, D4, D5, D6, D7, D8)
end
end
do
TITLE(testkit.color.white_underline("Mirror query"))
local ecs = mirror.World.new()
do
TITLE("one component in common")
local function view_bench(world: jecs.World, A: i53, B: i53, C: i53, D: i53, E: i53, F: i53, G: i53, H: i53)
BENCH("1 component", function()
for _ in world:query(A) do
end
end)
BENCH("2 component", function()
2024-07-14 04:35:13 +00:00
for _ in world:query(B, A) do
2024-05-05 13:06:57 +00:00
end
end)
BENCH("4 component", function()
2024-07-14 04:35:13 +00:00
for _ in world:query(D, C, B, A) do
2024-05-05 13:06:57 +00:00
end
end)
BENCH("8 component", function()
2024-07-14 04:35:13 +00:00
for _ in world:query(H, G, F, E, D, C, B, A) do
2024-05-05 13:06:57 +00:00
end
end)
local e = world:entity()
world:set(e, A, true)
world:set(e, B, true)
world:set(e, C, true)
world:set(e, D, true)
world:set(e, E, true)
world:set(e, F, true)
world:set(e, G, true)
world:set(e, H, true)
2024-07-06 21:30:14 +00:00
BENCH("Update Data", function()
for _ = 1, 100 do
world:set(e, A, false)
world:set(e, B, false)
world:set(e, C, false)
world:set(e, D, false)
world:set(e, E, false)
world:set(e, F, false)
world:set(e, G, false)
world:set(e, H, false)
end
end)
2024-05-05 13:06:57 +00:00
end
local D1 = ecs:component()
local D2 = ecs:component()
local D3 = ecs:component()
local D4 = ecs:component()
local D5 = ecs:component()
local D6 = ecs:component()
local D7 = ecs:component()
local D8 = ecs:component()
local function flip()
return math.random() >= 0.15
end
local added = 0
2024-05-01 12:41:51 +00:00
local archetypes = {}
for i = 1, 2 ^ 16 - 2 do
local entity = ecs:entity()
local combination = ""
if flip() then
combination ..= "B"
ecs:set(entity, D2, { value = true })
end
if flip() then
combination ..= "C"
ecs:set(entity, D3, { value = true })
end
if flip() then
combination ..= "D"
ecs:set(entity, D4, { value = true })
end
if flip() then
combination ..= "E"
ecs:set(entity, D5, { value = true })
end
if flip() then
combination ..= "F"
ecs:set(entity, D6, { value = true })
end
if flip() then
combination ..= "G"
ecs:set(entity, D7, { value = true })
end
if flip() then
combination ..= "H"
ecs:set(entity, D8, { value = true })
end
if #combination == 7 then
added += 1
ecs:set(entity, D1, { value = true })
end
2024-05-01 12:41:51 +00:00
archetypes[combination] = true
end
2024-05-01 12:41:51 +00:00
local a = 0
for _ in archetypes do
a += 1
end
2024-05-01 12:41:51 +00:00
view_bench(ecs, D1, D2, D3, D4, D5, D6, D7, D8)
end
2024-07-06 21:30:14 +00:00
end