Skip to main content
Documentation menu
On this page

Display

Particle System Performance Test

Render up to 500,000 GPU particles and measure how many your card can push before the frame rate falls.

  • Available — Live on this site right now.
  • Browser Tool — Runs in the browser you are reading this in.
  • No Install — Nothing to download, no extension, no account.
  • Client-Side — Runs entirely on your device. No test data is uploaded.

Live tool: /particle-system-performance-test/

This page explains the tool. The tool itself is one click away and needs no sign-in.

Open Particle System Performance Test

What is this tool?

The Particle System Performance Test draws a live GPU particle simulation and measures how well your card keeps up. It renders point-sprite particles through WebGL2, with the motion — spherical shells, spiral galaxies, chaotic attractors or a torus curl — computed on the GPU in the vertex shader, so the load is real vertex and fill work rather than a canvas trick.

Particles are seeded deterministically from a fixed pseudo-random seed, so the same count always starts from the same layout and runs are repeatable. The buffer pre-allocates half a million particles and draws as many as you ask for, from 1,000 up to 500,000.

Every figure is measured from real frames with performance.now(). The page also lists honest GPU info from the driver — renderer, vendor, GLSL version, limits — but never claims temperature, power, clocks, utilisation or VRAM, which a browser cannot read.

How to use it

  1. Set the particle count and complexityParticle Count runs 1K to 500K (100K default); Complexity (low / medium / high / extreme) selects the motion model. More particles and higher complexity are heavier.
  2. Tune size, speed and blendingPoint Size, Speed and Blending (standard alpha or additive) change how the particles look and cost; additive blending, the default, is more fill-intensive. Render Scale super-samples the canvas.
  3. Run a timed testDuration is 15, 30 or 60 seconds; a Quick 15s Test at 100K is one click. A one-second warm-up (capped at a quarter of the run) is rendered but excluded from the statistics.
  4. Or run the scaling sweepThe particle-count sweep runs several counts in turn and records a result and badge for each, so you can find the point where your GPU stops holding a smooth frame rate.

What the results mean

Average, min and max FPS

Average FPS is 1000 divided by the mean measured frame time; min and max bound the run. These exclude the warm-up so cold-start frames do not drag the average down.

1% low (with a validity gate)

The 1% low is the mean of the slowest 1% of frames as an FPS, but it is only shown once at least 100 measured frames exist. Below that it reads n/a rather than a misleading number from too small a sample.

Stability and jitter

Here jitter is the standard deviation of frame times, and stability is 100 × (1 − min(1, stdDev / mean frame time)). A frame is counted as dropped when it exceeds 33.33 ms — the 30 FPS budget — which is a looser threshold than the other GPU tools use.

Honest run status

Each result carries whether it completed, was aborted, or was interrupted (for example by tab-blur), plus the measured-frame count and warm-up length, so a partial run is never presented as a clean one.

What it can detect

  • The particle count at which your GPU stops holding a smooth frame rate
  • How motion complexity, point size and additive blending each cost performance
  • Worst-case stutter through a properly gated 1% low (n/a until 100 frames)
  • Your GPU's reported WebGL limits — max texture size, uniform vectors, viewport — from the driver

Limits worth knowing

A browser can only report what the platform gives it. These are the honest boundaries of this page, so a result is never read as more than it is.

  • It cannot read GPU temperature, power, clocks, utilisation or VRAM. The GPU-info tiles show only what the driver exposes through WebGL; no thermal, fan or power sensor is read or invented.
  • The 1% low needs at least 100 measured frames to be meaningful and shows n/a until then — a very short or very slow run may not reach that.
  • Its metric definitions differ from the other GPU tools: jitter is a standard deviation (not consecutive difference) and the frame-drop threshold is 33.33 ms (not 25 ms), so compare its numbers within this tool.
  • The particle buffer is capped at 500,000; asking for more is clamped to that ceiling.
  • Frame rate is bounded by the display refresh rate via requestAnimationFrame.

Tips

  • Use the scaling sweep rather than guessing: it walks the counts for you and marks where the frame rate falls off, which is more informative than a single 500K run.
  • If the 1% low shows n/a, lengthen the run — the gate needs at least 100 measured frames before it will trust the figure.
  • Additive blending is the heavier default; switch to standard blending to separate fill cost from vertex cost when you are diagnosing a slowdown.

Troubleshooting

The 1% low says n/a.

That is intentional. The tool refuses to report a 1% low from fewer than 100 measured frames, because a tiny sample would be misleading. Run a longer duration to populate it.

My run is marked interrupted.

You switched away from the tab. This is the one GPU tool that freezes its clock on tab-blur so the hidden time is not logged as slow frames, and it flags the run as interrupted for honesty. Keep the tab focused for a clean run.

Where is the GPU temperature?

A browser cannot read it. The GPU-info panel shows only driver-exposed WebGL details; temperature, power, clocks, utilisation and VRAM are not available and are never faked.

Ready to run it?

Render up to 500,000 GPU particles and measure how many your card can push before the frame rate falls. Nothing to install, and it opens in this browser.