diff --git a/test/benchmark.luau b/test/benchmark.luau index 4718aae..5a2b284 100644 --- a/test/benchmark.luau +++ b/test/benchmark.luau @@ -15,9 +15,10 @@ local vide = require "src/init" local N = 2^18 -- 262144[ BENCH("create state", function() - local cache = table.create(N) local source = vide.source + local cache = table.create(N) + for i = 1, START(N) do cache[i] = source(1) end @@ -40,39 +41,53 @@ BENCH("set value", function() end) BENCH("derive 1 state", function() - local cache = table.create(N) - local state = vide.source(1) local derive = vide.derive - for i = 1, START(N) do - cache[i] = derive(function() - return state() - end) - end + local cache = table.create(N) + local state = vide.source(1) + + vide.root(function() + for i = 1, START(N) do + cache[i] = derive(function() + return state() + end) + end + return nil + end) end) BENCH("derive 4 states", function() + local derive = vide.derive + local cache = table.create(N) local state = vide.source(1) local state2 = vide.source(2) local state3 = vide.source(3) local state4 = vide.source(4) - local derive = vide.derive - for i = 1, START(N) do - cache[i] = derive(function() - return state() + state2() + state3() + state4() - end) - end + vide.root(function() + for i = 1, START(N) do + cache[i] = derive(function() + return state() + state2() + state3() + state4() + end) + end + + return nil + end) end) BENCH("set derived value", function() local state = vide.source(1) - local _derived = vide.derive(state) - for i = 1, START(N) do - state(i) - end + vide.root(function() + local _derived = vide.derive(state) + + for i = 1, START(N) do + state(i) + end + + return nil + end) end) BENCH("apply 0 properties", function() @@ -104,28 +119,38 @@ end) BENCH("bind source", function() local apply = require "src/apply" + local instance = vide.create("Frame") {} local state = vide.source(1) - for i = 1, START(N) do - apply(instance, { - Name = state - }) - end + vide.root(function() + for i = 1, START(N) do + apply(instance, { + Name = state + }) + end + + return nil + end) end) BENCH("update binding", function() local apply = require "src/apply" + local instance = vide.create("Frame") {} local state = vide.source(1) - apply(instance, { - Name = state - }) + vide.root(function() + apply(instance, { + Name = state + }) - for i = 1, START(N) do - state(i) - end + for i = 1, START(N) do + state(i) + end + + return nil + end) end) BENCH("indexes() no change", function() @@ -137,15 +162,19 @@ BENCH("indexes() no change", function() local state = vide.source(data) - local _list = vide.indexes(state, function(v, i) - return {} + vide.root(function() + local _list = vide.indexes(state, function(v, i) + return {} + end) + + --state(state()) -- fill double buffer + + START(N) + + state(data) + + return nil end) - - --state(state()) -- fill double buffer - - START(N) - - state(data) end) BENCH("indexes() all change", function() @@ -157,19 +186,24 @@ BENCH("indexes() all change", function() local state = vide.source(data) - local _list = vide.indexes(state, function(v, i) - return {} + + vide.root(function() + local _list = vide.indexes(state, function(v, i) + return {} + end) + + --state(state()) -- fill double buffer + + for i, v in data do + data[i] = v + 1 + end + + START(N) + + state(data) + + return nil end) - - --state(state()) -- fill double buffer - - for i, v in data do - data[i] = v + 1 - end - - START(N) - - state(data) end) BENCH("indexes() all remove", function() @@ -181,15 +215,19 @@ BENCH("indexes() all remove", function() local state = vide.source(data) - local _list = vide.indexes(state, function(v, i) - return {} + vide.root(function() + local _list = vide.indexes(state, function(v, i) + return {} + end) + + table.clear(data) + + START(N) + + state(data) + + return nil end) - - table.clear(data) - - START(N) - - state(data) end) BENCH("values() no change", function() @@ -201,15 +239,19 @@ BENCH("values() no change", function() local state = vide.source(data) - local _list = vide.values(state, function(v, i) - return {} + vide.root(function() + local _list = vide.values(state, function(v, i) + return {} + end) + + state(state()) -- fill double buffer + + START(N) + + state(data) + + return nil end) - - state(state()) -- fill double buffer - - START(N) - - state(data) end) BENCH("values() all change", function() @@ -221,20 +263,24 @@ BENCH("values() all change", function() local state = vide.source(data) - local _list = vide.values(state, function(v, i) - return {} + vide.root(function() + local _list = vide.values(state, function(v, i) + return {} + end) + + state(state()) -- fill double buffer + + for i = 1, N do + local r = math.random(1, #data) + data[i], data[r] = data[r], data[i] + end + + START(N) + + state(data) + + return nil end) - - state(state()) -- fill double buffer - - for i = 1, N do - local r = math.random(1, #data) - data[i], data[r] = data[r], data[i] - end - - START(N) - - state(data) end) BENCH("values() all remove", function() @@ -246,86 +292,44 @@ BENCH("values() all remove", function() local state = vide.source(data) - local _list = vide.values(state, function(v, i) - return {} + vide.root(function() + local _list = vide.values(state, function(v, i) + return {} + end) + + table.clear(data) + + START(N) + + state(data) + + return nil end) - - table.clear(data) - - START(N) - - state(data) end) BENCH("register new cleanup", function() local cleanup = vide.cleanup - local cleaner = function() end + vide.root(function() + local cleaner = function() end - local callers = {} + local callers = {} - for i = 1, N do - callers[i] = function(fn, v) - fn(v) - return i -- return unique upvalue to ensure unique closure + for i = 1, N do + callers[i] = function(fn, v) + fn(v) + return i -- return unique upvalue to ensure unique closure + end end - end - for i = 1, START(N) do - callers[i](cleanup, cleaner) - end -end) + for i = 1, START(N) do + callers[i](cleanup, cleaner) + end --- cleanup cleanups from previous benchmark -;(collectgarbage :: any)("collect") -vide.step(0) - -BENCH("repeat cleanup", function() - local cleanup = vide.cleanup - - local foo = NO_INLINE(function(i) - cleanup(function() - -- return i -- uncomment to include overhead of closure creation - end) + return nil end) - - for i = 1, START(N) do - foo(i) - end end) --- cleanup cleanups from previous benchmark -;(collectgarbage :: any)("collect") -vide.step(0) - -BENCH("cleanup gc check", function() - local cleanup = vide.cleanup - - local cleaner = function() end - - local callers = table.create(N) - - for i = 1, N do - callers[i] = function() - cleanup(cleaner) - return i - end - - callers[i]() - end - - START(N) - - vide.step(0) -end) - -BENCH("cleanup gc removal", function() - START(N) - - vide.step(0) -- cleanup from previous benchmark -end) - - do -- the purpose of the two following benchmarks is to measure the overhead of -- aggregate construction