Internet speed test
Runs against Cloudflare’s public endpoints, so traffic leaves your network, and one run can move hundreds of MB on a metered plan. Nothing is sent to pulselan.com. Full detail
Latency under load
| Latency measured | Median round trip | Added vs idle |
|---|---|---|
| While idle | — | baseline |
| During download | — | — |
| During upload | — | — |
The grade is our own reading of the added milliseconds, on the widely used consumer bands (under 30 ms A, under 60 B, under 100 C, under 200 D, worse F). It is not a certification of anything. The milliseconds beside it are the number to trust, and a value landing on a boundary takes the lower grade.
Run detail
Why can the app and Safari disagree?
The same iPhone can use different network paths and connection protocols in Safari and the app. Test one at a time on the same Wi-Fi, leave both in the foreground, pause other large transfers and run three alternating pairs. Compare the median for each, along with the public IP and Cloudflare edge in each result. Ping is the best idle HTTP round trip; jitter is the mean absolute change between consecutive idle probes in both tests.
If you use iCloud Private Relay or a VPN, note its setting. For an optional direct-path comparison, temporarily turn off Private Relay for this Wi-Fi network under Settings → Wi-Fi → the network’s information button → Limit IP Address Tracking, then restore it afterwards. This reduces browsing privacy during that comparison. Apple explains Private Relay and speed tests. Different results do not by themselves prove Private Relay is enabled.
Timing fix published November 1, 2026: this page uses internet profile 2. App releases containing the same fix show profile 2 under Measurement details; older app results use the previous timing method.
Download, upload, idle latency, jitter, and latency under load with an A–F bufferbloat grade — measured in this browser tab, right now. By default it uses four transfers (or one in Single mode), a 1.5-second warm-up and a fixed ten-second measurement window per direction. Ping and jitter use the app’s definitions. Browser and native transports differ, so matching settings do not guarantee matching speeds.
This test sends traffic to Cloudflare’s public speed-test endpoints (speed.cloudflare.com). It is an internet test, so it necessarily leaves your network: Cloudflare sees the requests and your IP address, exactly as it would for any site you visit. Nothing is sent to pulselan.com — this site has no analytics, no accounts, and never receives your results. Your run stays in this tab and is gone when you close it.
A full run moves real data. Each direction is measured for ten seconds at whatever rate your link sustains, so a fast connection can transfer several hundred megabytes in one test. On a metered mobile plan, that is worth knowing before you tap Start.
How this page measures
Latency first, with the first probe thrown away. A warm-up request pays TCP and TLS setup, and counting it would inflate the idle baseline — which would quietly flatter the bufferbloat grade by making the added latency look smaller. Up to ten probes then follow, with an eight-second cap so a slow link cannot stretch the phase indefinitely — the run detail reports how many actually landed. Ping is the best (minimum) round trip of those, because the minimum is the closest thing to the path’s floor; jitter is the mean absolute difference between consecutive probes, which is the same definition the PulseLAN app uses. Fewer than two probes cannot produce a jitter figure, so in that case it reads “—” rather than a confident 0.
Then throughput, over four concurrent transfers each way by default (one in Single mode). A fixed 1.5-second warm-up is discarded, then bytes observed during the next ten seconds are counted. Waiting for final acknowledgements cannot reduce the finished rate, and callbacks after the deadline cannot add bytes. Both this page and app internet profile 2 retain the existing 4% overhead compensation. Downloads use adaptive chunks; browser uploads use bounded XMLHttpRequest POSTs with progress events, while the native app streams its POST bodies. Four browser transfers can share one HTTP/2 or HTTP/3 connection; they are not necessarily four independent network connections. Upload progress describes the browser network stack, not proof of receipt at the server.
Latency is sampled throughout, every 300 ms. Each phase reports the median of its samples, not the mean, so one scheduler hiccup cannot decide your grade. The added-latency figure is the worse of the two loaded medians minus the idle median.
The ping shown is an HTTP round trip, and it will read higher than ping in a terminal. A probe is a one-byte request, so the time we measure includes Cloudflare running the code that answers it — roughly 20 ms of their own processing on the runs we tested — plus a few milliseconds of browser and JavaScript scheduling on top. That is not an error, it is what the number is: the time for a real request to be answered. The run detail below the results reports Cloudflare’s own view of the connection’s minimum round trip alongside ours, precisely so the gap is visible rather than hidden. Note that an inflated idle baseline makes the added-latency figure smaller, so it errs toward a kinder grade, never a harsher one.
Nothing here is ever filled in with a zero. A phase that fails shows an error and no number; a metric with too few samples shows “—”. Values under 10 ms are shown with decimals, because rounding a fast link to “0 ms” reads as a broken tool rather than a quick connection.
A browser test measures the browser’s path and transport. Browser connection sharing, progress-event batching, CPU load, Wi-Fi conditions and request overhead can change the result in either direction. Safari may also use iCloud Private Relay while the native app’s HTTPS traffic takes a direct route. This page cannot detect Private Relay reliably and does not bypass it. A low browser result alone does not establish a fault in your internet connection.
Keep the test in the foreground. Browsers can throttle timers and network delivery in a background tab. This test stops when the tab becomes hidden, clears the incomplete readings and asks you to restart. This avoids presenting a throttled run as a valid measurement.
It measures your internet path, not your LAN. Everything on this page is about the route from this device to a Cloudflare edge. It says nothing about how fast this device can talk to your NAS, your desktop, or the laptop in the next room — that is a different link entirely, and measuring it is what the PulseLAN app does. If a file copy at home is slow, this page cannot find it.
We do not name your ISP or your location, because we cannot read them. Cloudflare does not expose that information to a page in your browser, and we are not going to guess at it. The edge code shown in the run detail is a Cloudflare data-centre identifier and nothing more — it is not a city. There are no comparisons to other users on this page either: we have no data on other users, so any such figure would be invented.
One run is one moment. Whatever else was using your connection is part of what you just measured. Run it twice before you conclude anything, and three times before you phone anyone about it.
Slow file copies are usually not an internet problem
If this page reports a healthy internet connection and copying a file to your NAS still crawls, the bottleneck is inside your house — access point placement, a bad run of cable, a device parked on the 2.4 GHz band. No internet speed test can see that link, including this one.
The PulseLAN app measures device to device across your own network, and holds both numbers so it can say which side is the limiting factor.