500 / 2,000-switch stress comparison

Five technique scenes, including a native unanimated reference. All controls change state together, twice per trial. Same 1920×1440 viewport and 200ms motion; five trials per case.

These graphs do not rank whole libraries. The edge, transform, and grid scenes are normalized illustrations. Transform/grid do not reproduce Slidebox's deformation. FPS means rAF callback cadence, not actual GPU-presented frames. This is a local headless Chromium pilot, not a device-wide or cross-browser performance claim.

Read the online alternatives and source links · Download raw JSON · Explore the live scenes · Earlier software-rendered headless pilot

Read timing and work together: less layout time in a low-FPS case can mean fewer animation frames ran, not that the implementation became more efficient. Zero layout counters also do not guarantee smooth compositor or GPU output. The browser reported: ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver).

Browser default: will-change autoProperty-specific will-change

500 visible controls

rAF callback FPS

rAF callback FPS for 500 controls

95th-percentile callback interval

95th-percentile callback interval for 500 controls

Layout time per two-batch trial

Layout time per two-batch trial for 500 controls

Style recalculation time per trial

Style recalculation time per trial for 500 controls

Layout passes per trial

Layout passes per trial for 500 controls

Maximum CLS session score

Maximum CLS session score for 500 controls

2,000 visible controls

rAF callback FPS

rAF callback FPS for 2000 controls

95th-percentile callback interval

95th-percentile callback interval for 2000 controls

Layout time per two-batch trial

Layout time per two-batch trial for 2000 controls

Style recalculation time per trial

Style recalculation time per trial for 2000 controls

Layout passes per trial

Layout passes per trial for 2000 controls

Maximum CLS session score

Maximum CLS session score for 2000 controls

Detailed results

Each cell is the median of independent trials. Zero CLS does not mean zero layout work. These synthetic batch toggles are not real-user INP data. JS heap excludes GPU and compositor memory.

TechniqueCountHintTrialsrAF FPSp95 frame interval (ms)Intervals >25ms (%)Layout passesStyle recalculationsLayout (ms)Style (ms)Main thread task (ms)Shift entriesCLSLong animation framesJS heap bytes
Slidebox margins500auto558.416.82.7283036.2124.0361.500.0000001604812
Slidebox margins500on556.933.25.6283034.1120.7345.300.0000001604552
Slidebox margins2000auto516.7233.358.381058.2233.41078.640.0026951254308
Slidebox margins2000on512.0266.763.67847.4232.3926.330.0022541157644
Left/right edges500auto558.416.82.7283037.2108.2342.000.0000001606608
Left/right edges500on541.633.440.7202229.095.9530.380.0008001621436
Left/right edges2000auto516.2233.461.57850.4172.6913.920.0024851158148
Left/right edges2000on55.8383.380.0020.086.01249.200.0000021002952
Transform slide500auto555.333.38.60270.0103.9418.300.0000001580208
Transform slide500on550.533.412.50270.0102.4487.000.000001976696
Transform slide2000auto54.4566.683.3020.063.41207.300.000002995848
Transform slide2000on53.9800.075.0020.069.91738.300.000000990788
Grid-track slide500auto556.833.35.6242665.6201.5499.600.000000971104
Grid-track slide500on556.833.35.6232557.0200.4476.710.000070973496
Grid-track slide2000auto510.8266.662.55784.7326.81037.120.0022451107556
Grid-track slide2000on510.5249.958.33555.8293.8940.410.0021441106384
Native (no animation)500auto560.016.70.0020.04.632.600.0000001534572
Native (no animation)2000auto560.016.80.0020.021.465.700.0000001770664

Environment and method

{
  "environment": {
    "browser": "156.0.8078.4",
    "headless": true,
    "node": "v26.12.0",
    "platform": "linux",
    "architecture": "x64",
    "kernel": "Linux 7.2.8-9-omarchy",
    "cpu": "11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz",
    "release": "1.3.0",
    "cssSha256": "16ba4272fa96b7a72649cacefc977c6580f648827bbcefd3be54a1373cf4b703",
    "graphics": {
      "devicePixelRatio": 1,
      "hardwareConcurrency": 16,
      "renderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
      "supportedObservers": [
        "element",
        "event",
        "first-input",
        "interaction-contentful-paint",
        "largest-contentful-paint",
        "layout-shift",
        "long-animation-frame",
        "longtask",
        "mark",
        "measure",
        "navigation",
        "paint",
        "resource",
        "soft-navigation",
        "visibility-state"
      ]
    }
  },
  "method": {
    "viewport": {
      "width": 1920,
      "height": 1440
    },
    "trials": 5,
    "togglesPerTrial": 2,
    "counts": [
      500,
      2000
    ],
    "animationMs": 200,
    "tailDelayMs": 20,
    "sample": "rAF intervals overlapping the first 300ms after each actual batch start",
    "fps": "1000 / mean sampled rAF interval; not a presented-frame/GPU FPS counter",
    "longIntervalThresholdMs": 25,
    "willChange": "Property-specific hints, configured before warmup; not promotion guarantees",
    "normalization": "Independent technique illustrations; not whole-library/package benchmarks. Same dimensions/colors/duration, transform/grid do not deform.",
    "trace": "Primary trials run without DevTools tracing, screenshots, or video recording. CDP Performance counters sampled at trial boundaries."
  },
  "startedAt": "2026-10-31T08:45:44.066Z",
  "completedAt": "2026-10-31T08:48:34.750Z"
}

Harness source: primary runner · diagnostic trace collector · HTML/CSS scene.