jecs/benches/query.bench.lua
2024-04-24 17:32:07 +02:00

184 lines
4.2 KiB
Lua

--!optimize 2
--!native
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local rgb = require(ReplicatedStorage.rgb)
local Matter = require(ReplicatedStorage.DevPackages.Matter)
local Rewrite = require(ReplicatedStorage.rewrite)
local ecr = require(ReplicatedStorage.DevPackages.ecr)
local newWorld = Matter.World.new()
local world = Rewrite.World.new()
local component = Rewrite.component
local jecs = require(ReplicatedStorage.Lib)
local ecs = jecs.World.new()
local A1 = Matter.component()
local A2 = Matter.component()
local A3 = Matter.component()
local A4 = Matter.component()
local A5 = Matter.component()
local A6 = Matter.component()
local A7 = Matter.component()
local A8 = Matter.component()
local B1 = ecr.component()
local B2 = ecr.component()
local B3 = ecr.component()
local B4 = ecr.component()
local B5 = ecr.component()
local B6 = ecr.component()
local B7 = ecr.component()
local B8 = ecr.component()
local C1 = component()
local C2 = component()
local C3 = component()
local C4 = component()
local C5 = component()
local C6 = component()
local C7 = component()
local C8 = component()
local D1 = ecs:entity()
local D2 = ecs:entity()
local D3 = ecs:entity()
local D4 = ecs:entity()
local D5 = ecs:entity()
local D6 = ecs:entity()
local D7 = ecs:entity()
local D8 = ecs:entity()
local registry2 = ecr.registry()
local function flip()
return math.random() >= 0.15
end
local common = 0
local N = 2^16-2
local archetypes = {}
for i = 1, N do
local id = registry2.create()
local combination = ""
local n = newWorld:spawn()
local entity = ecs:entity()
local e = world:spawn()
if flip() then
combination ..= "B"
registry2:set(id, B2, {value = true})
world:insert(e, C2({ value = true}))
ecs:set(entity, D2, { value = true})
newWorld:insert(n, A2({value = true}))
end
if flip() then
combination ..= "C"
registry2:set(id, B3, {value = true})
world:insert(e, C3({ value = true}))
ecs:set(entity, D3, { value = true})
newWorld:insert(n, A3({value = true}))
end
if flip() then
combination ..= "D"
registry2:set(id, B4, {value = true})
world:insert(e, C4({ value = true}))
ecs:set(entity, D4, { value = true})
newWorld:insert(n, A4({value = true}))
end
if flip() then
combination ..= "E"
registry2:set(id, B5, {value = true})
world:insert(e, C5({value = true}))
ecs:set(entity, D5, { value = true})
newWorld:insert(n, A5({value = true}))
end
if flip() then
combination ..= "F"
registry2:set(id, B6, {value = true})
world:insert(e, C6({value = true}))
ecs:set(entity, D6, { value = true})
newWorld:insert(n, A6({value = true}))
end
if flip() then
combination ..= "G"
registry2:set(id, B7, {value = true})
world:insert(e, C7{ value = true})
ecs:set(entity, D7, { value = true})
newWorld:insert(n, A7({value = true}))
end
if flip() then
combination ..= "H"
registry2:set(id, B8, {value = true})
world:insert(e, C8{ value = true})
newWorld:insert(n, A8({value = true}))
ecs:set(entity, D8, { value = true})
end
if #combination == 7 then
combination = "A" .. combination
common += 1
registry2:set(id, B1, {value = true})
world:insert(e, C1{ value = true})
ecs:set(entity, D1, { value = true})
newWorld:insert(n, A1({value = true}))
end
archetypes[combination] = true
end
local white = rgb.white
local yellow = rgb.yellow
local gray = rgb.gray
local green = rgb.green
local WALL = gray("")
local numberOfArchetypes = 0
for _ in archetypes do
numberOfArchetypes += 1
end
print(common)
print(
"N entities "..yellow(N)
..WALL
.."with common components: "
..yellow(tostring(common).."/"..tostring(N)).." "
..yellow("("..string.format("%.2f", (common / (2^16 - 2)* 100)).."%)")
..WALL
..yellow("Total Archetypes: "..numberOfArchetypes)
)
return {
ParameterGenerator = function()
return
end,
Functions = {
ECR = function()
local matched = 0
for entityId, firstComponent in registry2:view(B5, B6, B3, B4, B8, B7) do
matched += 1
end
end,
Rewrite = function()
local matched = 0
for entityId, firstComponent in world:query(C5, C6, C3, C4, C8, C7) do
matched += 1
end
end,
Jecs = function()
local matched = 0
for entityId, firstComponent in ecs:query(D5, D6, D3, D4, D8, D7) do
matched += 1
end
end
},
}