Reference

Stream Benchmarks

Planned bandwidth and performance measurements for RoExpress Stream. This page will be updated with real in-engine numbers once the benchmark suite is complete.

Coming soon. These benchmarks are planned for a future release. The figures shown in this page are estimates based on wire format analysis — they will be replaced with measured values from actual Roblox sessions.

What will be measured

The benchmark suite will cover five areas:

AreaWhat it captures
Full packet bandwidthRaw bytes per second at N players × T tick rate for a fixed schema
Delta compression savingsByte reduction when only 1 of 5 fields changes vs all 5 changing
SendExcept vs BroadcastDelta at scaleServer CPU cost of per-player relay vs shared broadcast
Fixed vs variable schemaPack/unpack time and byte count with and without string fields
Rate limiter overheadTokenBucket cost per dropped packet under flood conditions

Wire size estimates

Based on the wire format ([channelId: u16][seq: u16][payload]), estimated packet sizes for the standard player-movement schema:

Schema: userId (f64) + cf (CFrameLight) + health (u8)

FieldTypeWire bytes
Channel ID + seqheader4 B
userIdf648 B
cfCFrameLight16 B
healthu81 B
Total (full packet)29 B

Estimated bandwidth at scale (full packets, no delta)

PlayersTick ratePackets/s (server recv)Bytes/s (server recv)
1020 Hz200~5.7 KB/s
2020 Hz400~11.4 KB/s
5020 Hz1,000~28.5 KB/s
10020 Hz2,000~57 KB/s
10030 Hz3,000~85 KB/s

Delta compression estimate (CFrameLight moving player)

When a player is moving, typically only cf changes each tick (userId and health are constant). The delta payload contains a 1-byte bitmask plus the changed fields only:

ScenarioPayload bytesvs full packet
All 3 fields changed1 (mask) + 25 = 26 BNo savings (mask overhead)
cf only changed (moving player)1 (mask) + 16 = 17 B~34% smaller payload
health only changed (hit)1 (mask) + 1 = 2 B~92% smaller payload
Nothing changed (standing still)1 (mask) = 1 B~96% smaller payload

Delta compression is most effective for fields that change rarely — health, animation state, flags. For a position field that changes every frame, the savings are modest (mask overhead applies).

Schema design guidance

Until measured benchmarks are available, these rules of thumb apply:

RuleReason
Prefer CFrameLight over CFrame for humanoids16 B vs 28 B — humanoids only rotate on Y axis
Use u8 for health (0–255) not f321 B vs 4 B
Pack boolean groups into { "flags", ... }Up to 8 booleans in 1 byte vs 8 bytes
Avoid string fields in high-frequency channelsVariable size disables delta compression and pre-allocation
Use Vector3int16 for tile-snapped positions6 B vs 12 B for Vector3

Test methodology (planned)

Benchmarks will be run inside Roblox Studio using Benchmark (the built-in micro-benchmark module) and a controlled multiplayer test environment with simulated players. Each configuration will run for 30 seconds at stable load and report median, p95, and p99 latency alongside total bytes transferred.

See also

Stream | API reference  ·  Stream: Server Side | send methods and delta  ·  Stream: Client Side | throttling recommendations  ·  Benchmark | the micro-benchmark module used in testing