CPU rendering: numbers and receipts
Experimental native renderer · local hardware study
Apple M3 Pro · 11 available logical CPUs · native TextGrid · 1920×1080 · 300 frames at 30fps · software x264 CRF11
The native Helios path is experimental Git source merged in PR #5006. Installing the general browser renderer from npm does not reproduce this benchmark.
Helios delivered this 300-frame TextGrid workload in 4.21 seconds at ultrafast and 11.99 seconds at medium. On the tested Apple M3 Pro, those medians were 1.75× and 1.27× the speed of fframes. Against Remotion, the ratios were 4.31× and 2.00×.
The measurements below cover an experimental native Helios renderer, a pinned fframes CPU renderer and Remotion running in a strict CPU configuration. Each engine used its own rasterizer. These results apply to this local workload and the disclosed settings.
01 / Measured results
Delivered video timings
Three fresh timed rounds per engine and preset. Charts show medians of original delivered process times. Lower is faster. Each preset used balanced orders: Helios/fframes/Remotion, fframes/Remotion/Helios, Remotion/Helios/fframes. One warmup per engine/preset is excluded. Helios finished first in every timed round. Bars use a shared linear scale within each preset.
Speed ratio = competitor median seconds ÷ Helios median seconds. The holdout supplied the comparison statistics. Earlier screens only selected settings.
medium
Median delivered seconds · lower is fasterHelios won 3/3 timed rounds vs fframes and 3/3 vs Remotion.
All three original rounds and within-round ratios
| Round | H seconds | F seconds | R seconds | F/H | R/H |
|---|---|---|---|---|---|
| 1 | 11.99 | 15.20 | 24.18 | 1.27× | 2.02× |
| 2 | 11.88 | 15.20 | 23.86 | 1.28× | 2.01× |
| 3 | 12.09 | 15.77 | 24.04 | 1.30× | 1.99× |
Original timer values are in nanoseconds in the downloadable receipts.
ultrafast
Median delivered seconds · lower is fasterHelios won 3/3 timed rounds vs fframes and 3/3 vs Remotion.
All three original rounds and within-round ratios
| Round | H seconds | F seconds | R seconds | F/H | R/H |
|---|---|---|---|---|---|
| 1 | 4.21 | 7.36 | 18.00 | 1.75× | 4.27× |
| 2 | 4.54 | 7.62 | 18.38 | 1.68× | 4.05× |
| 3 | 3.76 | 6.99 | 18.17 | 1.86× | 4.84× |
Original timer values are in nanoseconds in the downloadable receipts.
02 / Reproducibility
Protocol and settings
The workload
The TextGrid fixture animates 3,334 labels using the pinned fframes benchmark equations and DM Sans font. Output is ten seconds at 1080p, with 300 frames at 30fps. Canvas, CPU SVG and DOM paths draw that fixture through different rasterizers.
The clock
Original external perf_counter_ns timers start with a fresh export process and stop after the final video completes a full decode check. Delivery includes process startup, drawing, software encoding, stitching and that final check. Helios validates internally once; fframes and Remotion receive one external validation. Setup, hashing, encoder inspection and the later fidelity measurement are outside this clock.
Software encoding
All profiles use libx264 at CRF11, GOP24, BT.601 TV-range YUV420P and the stated medium or ultrafast preset. Encoder metadata was inspected. CRF matches the encoding control; it does not imply identical output sizes or pixels.
CPU stages
The tested native Canvas and CPU SVG paths use software rendering. Remotion used a software-only Chromium configuration with compositor/rasterization evidence retained in its receipts. These CPU measurements do not compare either engine’s GPU mode.
Holdout profiles
| Profile | Engine | Preset | Workers | Encoder threads | JPEG quality |
|---|---|---|---|---|---|
| H-medium-w4-t4 | Helios native | medium | 4 | 4 | — |
| F-medium-w11-t2 | fframes CPU | medium | 11 | 2 | — |
| R-medium-w11-t8 | Remotion CPU | medium | 11 | 8 | 100 |
| H-ultrafast-w8-t2 | Helios native | ultrafast | 8 | 2 | — |
| F-ultrafast-w11-t2 | fframes CPU | ultrafast | 11 | 2 | — |
| R-ultrafast-w11-t8 | Remotion CPU | ultrafast | 11 | 8 | 100 |
Helios and fframes encoder threads are per worker or segment encoder. Remotion’s eight threads apply to an active encoder. Its eleven renderer workers do not imply eleven concurrent encoders.
These profiles were the fastest eligible settings in the disclosed bounded screens. Tuning was not exhaustive. Remotion used JPEG100 because JPEG80 failed the fixed fidelity floor.
fframes ultrafast needed a stream-copy edit-list repair. Its delivery clock includes the repair and final decode check, and both the original and repaired artifacts remain bound in the receipts.
Pinned versions and bindings
| Helios source commit | 0566d1108f922ea88294d4bbe1f11cdb49849834 |
|---|---|
| fframes revision | bacfc3c3212d3d9429468435bfdc1ae2a21c7b3b |
| Remotion | 4.0.529 |
| Node | 24.19.0 |
| FFmpeg | 9.0 |
| x264 core | 165 |
| Chrome | 149.0.7790.0 |
| DM Sans font SHA-256 | 9ae2da663d64342031e59b5fa680dd355171d021b7ebf83774efc7c0330ae7b5 |
Nineteen compiled JavaScript files matched the frozen candidate byte for byte. The 115-file native source tree at merge matched the tested head.
03 / Qualification
Every-frame quality
All 24 holdout exports, including six warmups, completed and qualified. Repeated identical outputs share six unique every-frame metric sets, each covering all 300 frames. Actual cadence is checked independently: the video has 300 frames with presentation timestamps n/30.
Each encoded output is compared against its own engine’s lossless rasterizer reference. Every frame must meet SSIM Y ≥ 0.995 and PSNR Y ≥ 40dB, U ≥ 35dB and V ≥ 35dB. These checks qualify encoding fidelity and cadence. Different native rasterizers prevent a claim of cross-engine pixel identity.
The saved Remotion comparison clock was corrected to a shared exact 1/30 timebase after actual cadence had been checked. The correction reused saved outputs and preserved their original performance timers.
04 / Separate paired study
A measured gain inside Helios
The final full-decode check was spending roughly ten seconds on one decoder thread in the medium baseline. We bounded that decoder by available CPU parallelism, capped at eight threads, while retaining the complete check. Packet probes still use one thread.
A separate frozen-baseline study ran three fresh pairs per preset. Median within-pair delivery speedup was 1.59× at medium and 1.67× at ultrafast. All six paired outputs had identical encoded bytes. The original clocks and component measurements are downloadable.
This paired study used medium 4 drawing workers/8 encoder threads per worker and ultrafast 6/4. Its settings differ from the competitor holdout. The decoder change is a measured contributor to delivery performance; this experiment does not attribute the entire competitor advantage to that change.
const decoderThreads = packets
? '1'
: String(Math.min(8, availableParallelism()));05 / Audit trail
Receipts and limitations
The experiment covers one ten-second TextGrid workload on one Apple M3 Pro running macOS arm64. Three timed rounds describe this study; they do not establish a population-wide performance distribution.
Arbitrary browser compositions, media-heavy videos and CPU-only remote hosts need separate measurements. A fresh scheduler or Orb superiority result has not been established.
The compact source bundle contains adapted reproduction tooling and original receipts. Its fresh build/export/reference flow has not been executed end-to-end. Large original videos and frozen runtimes are omitted. Review its README before treating it as a reproduced environment.
benchmark-reproduction.zip · 290.7 KB (297,712 bytes)
SHA-256
19415647a9696a034b46a8ff0cb7f98f481d6a49504a44d39e0127cbd3a50261holdout-receipts.json · 2455.5 KB (2,514,483 bytes)
SHA-256
6f747d497b2af19628524ef42136c0eeeb2def0578fcd7c2269c60186239bd23decoder-paired-receipts.json · 7.3 KB (7,456 bytes)
SHA-256
69de7fafe61556b3fdbec3b83e210e150f418baef5c7184ec9e14c3ad1ae4adfmerge-receipts.json · 1.9 KB (1,928 bytes)
SHA-256
dd6958aeae8d014cb57a005bcc70ff9a36acef7ba83a3deb6dda248ff232f22csummary.json · 2.3 KB (2,338 bytes)
SHA-256
a425d76d2039974eeda1ce230526a3812d73d41675a02e487fb2300235a9b64aVerify downloads against SHA256SUMS. Original manifest SHA-256: 097fb0d8bd5381203a4755d05267fd04416e56f641be2798f226e510aed90461