Click to start the speed test
Throughput samples
Test failed
Operators quote Mbps (megabits per second); 1 MB/s = 8 Mbps.
Download
—Mbps
Upload
—Mbps
Ping
—ms
Jitter
—ms
Last 5 runs
No runs yet. Press GO above to start the first one.
What is this
SpeedTest measures the throughput of your own connection. One click on the big GO button and the browser does three things in order: it sends ten empty requests to the test endpoint to get round-trip latency (ping and jitter), it pulls several parallel download streams with progressively larger payloads to get download throughput, and it keeps posting locally generated random payloads to get upload throughput. The gauge shows the live rate, the curve under it plots every sample over time, and four result cards summarise download / upload / ping / jitter at the end.
The endpoints used are Cloudflare's public speed-test API, so the test traffic goes straight to a Cloudflare edge and never through this site: we ship a static page with no backend and no logs. Rates are computed by your own browser from wall-clock timings and known byte counts, so nothing depends on cross-origin response headers. Results are kept only in your browser's localStorage (the last 5 runs, clearable at any time).
Features
- Four numbers in one runDownload and upload throughput (switchable between Mbps and MB/s), round-trip latency (min and average over ten samples) and jitter (mean absolute deviation between consecutive samples), all in the cards and in the copied summary.
- Progressive sampling, slow and fast links alikeTwo 1 MB warm-up probes are discarded, then the payload size adapts to the rate measured so far while several parallel streams fill a 5-10 second window, finishing early once enough bytes have moved. The same logic serves a 10 Mbps ADSL line and a 1 Gbps fibre line.
- Incompressible upload payloadUpload bytes come from crypto.getRandomValues in chunks, so no intermediate proxy or compression can inflate the number - you get closer to the real usable upstream.
- Stoppable, retryable, never stuckEach phase has its own timeout, so a blocked endpoint, a firewall or a certificate problem turns into a readable failure message with a Retry button, and Stop aborts every in-flight request through AbortController instead of leaving the gauge spinning forever.
- Gauge, curve and historyAn SVG gauge on a non-linear scale (0 / 10 / 20 / 50 / 100 / 200 / 500 Mbps) with a needle and a live readout, a canvas sparkline that shows jitter and stalls, and the last five runs kept locally so you can compare the same hour across days.
- Zero dependencies, pure staticNo third-party runtime library: the UI and the measurement code live in this one script. There is no backend and no telemetry, and the interface ships in Simplified Chinese, Traditional Chinese and English.
How to use
- Press the big GO button; the three phases light up in order, and Stop cancels the run at any time.
- Read the four result cards. Prefer the number your download manager shows? Switch to MB/s in the top right - note that operators quote Mbps.
- Press Copy result to take a one-line summary (download / upload / ping / jitter / unit) to support staff or into your log.
- Run it again at another time of day - the last five runs are kept at the bottom, and Clear history removes them.
Data source and method
Downloads use speed.cloudflare.com's __down?bytes=N endpoint (a GET that returns exactly N bytes), uploads use __up on the same host (a POST of a locally generated random payload), and latency is the round-trip time of __down?bytes=0. Throughput is bytes multiplied by 8, divided by the elapsed wall clock from performance.now(), divided by 1e6 (Mbps). Ping is the minimum and average over repeated round trips; jitter is the mean absolute deviation between consecutive round trips. Warm-up samples (the first 1 MB probes and the TCP slow-start ramp) are excluded from the final numbers.
Treat the result as a feel reference, not a billing audit. A browser only sees bytes delivered at the HTTP layer and times them with the wall clock, so TLS handshakes, TCP slow start and congestion windows, proxies and caches, NIC buffers and OS scheduling all add error; the window is only a few seconds, so a short stall (a phone hopping Wi-Fi bands, say) moves the number visibly. To verify a contracted line, use your operator's or vendor's own tool several times.
FAQ
- Why is it lower than the bandwidth I pay for?
- More things sit between you and that number than raw bandwidth: Wi-Fi signal and band (2.4 GHz often delivers a few tens of Mbps), other devices on the same network and their background updates, the NAT performance of your router or ONT, how far the Cloudflare edge you landed on is, and the interconnect and congestion between that edge and your ISP. To approach the quoted figure, use an Ethernet cable straight to the modem, stop other downloads, and take the best of several runs at different hours.
- Is this an exact measurement?
- No, it is an approximation. A browser cannot read the NIC counters; it counts bytes at the HTTP layer and times them with the wall clock over a window of only a few seconds, so TCP slow start, proxy caches, OS scheduling and momentary congestion all show up in the result - two runs on the same machine can differ by 20-30%. What it is good for is comparison: same hour, same network, different device or different access method.
- Does my traffic go through your server? Are the results uploaded?
- Neither. All download and upload data comes from and goes to Cloudflare's public speed-test endpoint, speed.cloudflare.com, requested directly by your browser - this site is not on that path. We serve a static page with no backend, no API and no logs, and nothing is sent anywhere on your behalf. Rates and latency are computed in your browser's memory, and the history lives only in your own device's localStorage, invisible to others and removable with Clear history.
- Why is upload so much lower than download?
- Most access technologies are asymmetric by design: cable (DOCSIS), fibre-to-the-building and 4G/5G all give the upstream a narrower channel than the downstream, and home plans are often quoted as something like 100 Mbps down / 30 Mbps up. On top of that, a browser can open several parallel download streams to fill the pipe, while uploads are bounded by HTTP request-body and TLS record chunking, so a slightly lower measured upstream than the theoretical figure is normal.
- What do ping and jitter mean - which one matters for VoIP?
- Ping here is the minimum round-trip time between your device and the Cloudflare edge, in ms, mostly set by distance and access technology. Jitter is the mean absolute deviation between consecutive round trips and tells you how steady the path is. Voice calls and online games suffer from jitter and packet loss far more than from absolute latency: 60 ms with 2 ms of jitter usually feels fine, while 30 ms with 40 ms of jitter stutters.
More tools on this site
- IP Address Lookup
- Image Compressor
- PDF Toolkit
- Text Diff & Review
- Unicode Emoji Table
- Function Grapher
Pure front end · zero dependencies · free · EN / 简体 / 繁體