SIREN torture bench

The same workload on desktop, iPhone 15 Pro and iPhone 8. Run each phone once normally and once with Low Power Mode enabled in Settings. Keep this page visible. Audio synthesis runs at 48 kHz stereo, silently.


Ready. One simulated second of warmup precedes measurement.

Choose a workload and run.
What gets stressed?

Piano uses the current guest UI/player and piano device, rotating an eight-note bass chord. Torture adds a continuously busy guest CPU, 64 overlapping 48×48 BLITs at 120 frames per simulated second, all three filters and eight two-tap modulated feedback delays. The guest rewrites the native 0x100–0x3F7 register window on every 600 Hz interrupt: 456,000 byte writes/s, including fixed control/status bytes and note commands.

A seeded sequence of 32 constrained-random register snapshots repeats every 53 ms. Gates, partial weights, mixer gains and effects stay enabled; envelope pointers stay zero and frequencies stay in range. The two torture profiles exercise different paths — measure both. They challenge silence/unchanged-register fast paths; the page does not certify a universal worst-case workload.

Runs advance as fast as this browser allows. MIPS and executed MB/s are shown both per simulated second and per measured CPU-emulator second. Host costs are elapsed milliseconds per simulated second, not OS CPU utilization. Graphics includes guest BLIT time in CPU, framebuffer conversion separately, and browser canvas submission separately. Canvas/GPU presentation, audio hardware and AudioWorklet scheduling are not timed. Below 1× means the complete run fell behind real time. Phones may throttle during longer runs.

Current piano footprint

Measuring downloaded bytes…

Guest image includes keyboard UI, hit testing and player commands. It is generated by the browser bundle, so do not add its size again to the download total. Host JS/WASM implements the browser shell, VM, sound simulation and audio plumbing. Sizes below are response-body bytes, before optional HTTP compression; sound data is already gzip-packed. Assets are counted once by URL.

Play the piano