Files
lua/benchmark.lua
zeekay 91103511be Finish capnp->ZAP rebrand; vendor lunitx; decouple cjson; bump rockspec
Rename the Cap'n Proto Lua port to ZAP, brand-neutral throughout:
- capnp.lua -> zap.lua, capnp/ -> zap/, *.capnp -> *.zap, compiler bins
  capnpc-* -> zapc-*, schema/handwritten modules -> *_zap.lua. Zero
  capnp/Cap'n Proto leftovers in zap-native source/build (upstream-fork
  Kenton Varda copyright headers in proto/c++.zap and bin/schema.zap stay).
  Generated-code header and doc links point at github.com/zap-proto/lua and
  zap-proto.io.

Tests now run with no extra install:
- Vendor the lunitx test framework (Michael Roth / Doug Currie, MIT) under
  vendor/ (lunit, lunit.console, lunitx, lunitx.atexit). Its __gc atexit hook
  drives each test file under LuaJIT and exits nonzero on any failure.
- tests/run_tests.sh and test.sh are self-contained (set LUA_PATH incl
  vendor/), generate proto/example_zap.lua via the `zap` compiler when present,
  and skip 01/10 with a clear note (never a false pass) when it is absent.
  02-util and 03-compile are pure-Lua and always run.
- Verified under LuaJIT 2.1: 01(20) + 02(7) + 03(1) + 10(31) = 59 tests pass,
  0 failed; runner returns nonzero on an injected failure.

Decouple optional cjson so the runtime/compiler load under a bare LuaJIT:
- zap/compile.lua loads cjson lazily and only for debug logging (guarded by
  the debug flag); bin/zapc-llua makes the schema JSON dump optional.

Rockspec: bump lua-zap to 0.1.3-4, declare lua-cjson >= 2.1.0, and install the
vendored lunitx modules. .gitignore: scope the rockspec-pack ignore to repo
root so rockspec/ specs are tracked; ignore the `dump` test artifact.

TODO trimmed to the genuinely remaining items (AnyPointer set/decode, packed
serialization, schema_zap regeneration, multi-file compile, perf).
2026-06-20 00:12:16 -07:00

78 lines
1.4 KiB
Lua

jit.opt.start("loopunroll=1000", "maxrecord=5000", "maxmcode=1024")
package.path = "lua/?.lua;proto/?.lua;" .. package.path
local test_zap = require "handwritten_zap"
local ffi = require "ffi"
local test_zap = require "handwritten_zap"
local zap = require "zap"
local cjson = require "cjson"
local times = arg[1] or 1000000
local data = {
i0 = 32,
i1 = 16,
i2 = 127,
b0 = true,
b1 = true,
i3 = 65536,
e0 = "enum3",
s0 = {
f0 = 3.14,
f1 = 3.14159265358979,
},
l0 = { 28, 29 },
t0 = "hello",
e1 = "enum7",
}
local size = test_zap.T1.calc_size(data)
local buf = ffi.new("char[?]", size)
local bin = test_zap.T1.serialize(data)
local json_data = cjson.encode(data)
local tab = {}
function run4()
return test_zap.T1.serialize(data, buf, size)
end
function run3()
return test_zap.T1.serialize(data)
end
function run2()
return cjson.encode(data)
end
function run4()
return cjson.decode(json_data)
end
function run1()
return test_zap.T1.parse(bin, tab)
end
print("Benchmarking ", times .. " times.")
local res
function bench(name, func)
local t1 = os.clock()
for i=1, times do
res = func()
end
print(name, " Elapsed: ", (os.clock() - t1) .. "s")
end
bench("cjson encode", run2)
bench("zap encode", run3)
bench("cjson decode", run4)
--bench("zap-noalloc", run4)
bench("zap decode", run1)
--print(cjson.encode(res))