mirror of
https://github.com/littensy/charm.git
synced 2026-10-20 17:51:37 +00:00
79 lines
1.8 KiB
Text
79 lines
1.8 KiB
Text
local Charm = require("../packages/charm/src")
|
|
local bench = require("./bench")
|
|
|
|
local computed = Charm.computed
|
|
local mapped = Charm.mapped
|
|
local setActiveSub = Charm.setActiveSub
|
|
local signal = Charm.signal
|
|
|
|
type Entry = { number }
|
|
|
|
local count = 512
|
|
local initialState: { Entry } = table.create(count)
|
|
|
|
for i = 1, count do
|
|
initialState[i] = table.create(64, i)
|
|
end
|
|
|
|
local function mapper(value: Entry, key: number): (Entry, number)
|
|
return table.clone(value), key + 1
|
|
end
|
|
|
|
local function simpleMapped(source: () -> { Entry }, mapper: (Entry, number) -> (Entry, number)): () -> { Entry }
|
|
return computed(function()
|
|
local state = source()
|
|
local nextState = {}
|
|
|
|
for index, value in state do
|
|
local currentSub = setActiveSub(nil)
|
|
local success, valueOut, keyOut = pcall(mapper, value, index)
|
|
setActiveSub(currentSub)
|
|
|
|
if success then
|
|
nextState[keyOut] = valueOut
|
|
end
|
|
end
|
|
|
|
return state
|
|
end)
|
|
end
|
|
|
|
local function updatePercentage(percent: number): ({ Entry }) -> { Entry }
|
|
return function(state)
|
|
local nextState = table.clone(state)
|
|
for index, value in state do
|
|
if math.random() < percent then
|
|
nextState[index] = table.clone(value)
|
|
end
|
|
end
|
|
return nextState
|
|
end
|
|
end
|
|
|
|
for _, percent in { 0.1, 0.5, 1 } do
|
|
bench.run(`mapped {percent}`, function()
|
|
local src, setSrc = signal(initialState)
|
|
local out = mapped(src, mapper)
|
|
|
|
bench.profilebegin("init")
|
|
out()
|
|
bench.profileend()
|
|
setSrc(updatePercentage(percent))
|
|
bench.profilebegin("update")
|
|
out()
|
|
bench.profileend()
|
|
end)
|
|
|
|
bench.run(`control {percent}`, function()
|
|
local src, setSrc = signal(initialState)
|
|
local out = simpleMapped(src, mapper)
|
|
|
|
bench.profilebegin("init")
|
|
out()
|
|
bench.profileend()
|
|
setSrc(updatePercentage(percent))
|
|
bench.profilebegin("update")
|
|
out()
|
|
bench.profileend()
|
|
end)
|
|
end
|