Methodology · v1.1
How the test works.
Everything below is what the code actually does. No hidden multipliers, no padded numbers, no marketing-friendly rounding.
Where the measurement happens
Every test runs against a Cloudflare Pages Function serving the page you're on. Pages Functions execute at whichever Cloudflare PoP terminated your request — typically the one nearest you on the public internet. The Edge field on the result is the IATA code of that PoP.
That means this measures the speed from your network to your nearest CF edge — not to an arbitrary backbone server, and not to anyone's marketing-optimized destination. Real traffic to anywhere else (a SaaS app, a streaming service, a different cloud) will pass through different paths and will vary.
Download
- 4 parallel streams pulling random-byte chunks (incompressible).
- 15-second total window.
- Per-100ms instantaneous throughput samples are collected throughout the run.
- The first 2 seconds of samples are discarded to avoid biasing the result with TCP/QUIC slow-start.
- The headline number is the median of the remaining samples. Peak is shown as a secondary diagnostic — it is never the headline.
Upload
- 4 parallel streams POSTing 8 MB random-byte payloads (incompressible).
- 15-second window, same 2-second slow-start drop as download.
- Reducer differs from download: total bytes ÷ measurement-window duration (a mean), not median of 100 ms samples. Browsers do not expose per-byte upload progress for fetch requests, so 100 ms samples would only see chunk-completion spikes; a sample median would overstate throughput by roughly 2x. Mean across the whole window reflects what the wire actually carried.
- Payload is generated client-side with crypto.getRandomValues so no proxy in the path can compress it down to artificially high numbers.
Ping & jitter
- 20 sequential requests to /api/ping.
- The top 10% of samples (highest RTTs) are dropped as outliers.
- Ping = mean of the kept samples. Jitter = sample standard deviation of the kept samples.
What we don't do
- No overhead-compensation multiplier
- Other tools add ~4% to compensate for TCP/HTTP overhead. The number on this page is the bytes the browser actually counted, divided by the time they took.
- No zero-fill payloads
- Zero-filled traffic compresses on the wire and produces fictitious speed numbers. We use cryptographically random bytes so the wire sees real data.
- No best-of-N selection
- Each run is one independent measurement. Run it again to see how variance behaves on your link — the honest answer to "how stable is my connection."
- No raw IP storage
- When you share a result, we record country, city, ISP, ASN, and the CF edge code — never the raw IP.
Comparing results over time
Every stored result includes a methodology version. If we change anything substantive about measurement, the version bumps and old results stay flagged with the old version — so you can tell whether what you're comparing was measured the same way.
Why we built this
We run ComputeSphere, a PaaS that ships customer applications to multi-region edge infrastructure. The same honest-measurement discipline applies to the services we host — peak Mbps is a marketing number; the median over a real measurement window is what your users experience. We wanted a free tool that holds itself to that standard, and that we'd be comfortable pointing anyone at.
If you ship customer-facing apps and want them measured against the same rigour, come see what we built →