Skip to main content

Benchmarks

These numbers come from the in-repo benches under src/bench/, measured on an Apple M4. Absolute times vary by hardware, Studio build, and load; use the ratios and relative ordering as the main takeaway.

Each operation is timed with BenchHelper: 50 warm-up calls, then 10 timed batches. Reported Avg is mean microseconds per call across those batches.

VoidSentryUltimate throughput

Source: benchresults/benchresult.txt
Harness: LuauBench + RobloxBench
Iterations: 100,000 per timed batch

Values are average microseconds per call (μs). Lower is faster.

Scalars and strings

TypeSerializeDeserializeRoundTrip
U80.0490.0190.066
F320.0510.0180.067
F640.0490.0180.066
Bool0.0490.0180.066
String (100 chars)0.0760.0590.139

Vectors, buffers, and Roblox types

TypeSerializeDeserializeRoundTrip
Vector0.0520.0180.069
VectorF160.0690.0300.105
BufferFixed (32b)0.0680.0500.118
Buffer8 (33b payload)0.0770.0530.132
Color30.0530.0370.090
CFrame0.0910.0600.148
QCFrame0.0960.0520.149
CFrameF160.1570.1020.261
Instance0.0550.0200.075
SerInstance0.1840.9571.134

Collections

TypeSerializeDeserializeRoundTrip
Array (10 × U8)0.1510.1490.306
Array (100 × U8)0.9711.0442.006
Map (10 × U8U8)0.2610.3430.636
Map (100 × U8U8)2.0182.2234.473
Struct (10 × U8)0.1960.3640.578
Struct (100 × U8)1.5962.9454.632

Primitive nodes stay near 0.05 μs serialize and 0.02 μs deserialize. Cost grows mainly with collection size and with compressed / property-driven types such as CFrameF16 and SerInstance.

Versus Sera

Source: benchresults/seravssentryresult.txt
Harness: src/bench/SeraVsVoidSentry/Comparator.luau
Iterations: 10,000 per timed batch

Sera only serializes through schemas. For primitives, vectors, and CFrames the comparator wraps Sera values in a single-field schema, while VoidSentryUltimate uses bare nodes. Struct rows are the fairest same-shape comparison (Sera.Schema vs Types.Struct).

Speedup is Sera Avg ÷ VoidSentry Avg. Values above 1.00x mean VoidSentry was faster.

Numbers, bools, and strings

OperationSera (μs)VoidSentry (μs)Speedup
U8 Serialize0.090.051.80x
U8 Deserialize0.060.023.00x
U8 RoundTrip0.160.062.67x
F64 Serialize0.090.051.80x
F64 Deserialize0.060.023.00x
Bool Serialize0.090.051.80x
Bool Deserialize0.060.023.00x
String8 (100 chars) Serialize0.140.081.75x
String8 (100 chars) Deserialize0.100.061.67x

Vectors and CFrames

OperationSera (μs)VoidSentry (μs)Speedup
Vector3 Serialize0.090.051.80x
Vector3 Deserialize0.060.023.00x
Vector3 RoundTrip0.160.072.29x
CFrame Serialize0.140.091.56x
CFrame Deserialize0.090.051.80x
CFrame RoundTrip0.240.151.60x
LossyCFrame vs QCFrame Serialize0.140.101.40x
LossyCFrame vs QCFrame Deserialize0.120.052.40x

Structs (U8 fields)

OperationSera (μs)VoidSentry (μs)Speedup
1 field Serialize0.090.081.12x
1 field Deserialize0.060.090.67x
10 fields Serialize0.240.201.20x
10 fields Deserialize0.360.380.95x
100 fields Serialize1.801.531.18x
100 fields Deserialize2.872.940.98x
100 fields RoundTrip4.794.551.05x

Summary

  • Across the paired comparator suite, VoidSentry was faster on most operations (roughly 1.8× median, ~2× mean speedup).
  • The largest gaps are on deserialize of bare primitives, vectors, and CFrames.
  • On multi-field structs, the libraries are close: VoidSentry tends to win serialize; Sera occasionally edges small-struct deserialize.
  • Prefer the struct table when comparing schema-to-schema work; prefer the primitive tables when comparing each library's natural API for single values.

Reproducing

-- VoidSentry-only throughput (Luau subset + Roblox types)
local LuauBench = require(path.to.bench.LuauBench)
local RobloxBench = require(path.to.bench.RobloxBench)
LuauBench(true, 10_000)
RobloxBench(true, 10_000)

-- VoidSentry vs Sera
local Comparator = require(path.to.bench.SeraVsVoidSentry.Comparator)
Comparator(true, 10_000)

Raw logs used for this page live in benchresults/.