Vorla
Get Launcher

Internet Speed Test

Measure download throughput, latency and jitter against this site's own server. Everything runs in your browser, no app and no third-party service, and the download never uses more than 25 MB.

Test
1251025501002505001000

Ready. The test downloads up to 25 MB and stops early once the reading is steady.

No microphone, camera, screen or location access. The test downloads a file from vorla.dev and times it in this page.

Download
·
Download MB/s
·
Latency median
·
Jitter
·
Data used
0.0 / 25.0 MB
Rolling 2-second throughput·

Latency: 20 tiny round trips, HTTP and not ICMP ping

Min
·
Median
·
Mean
·
p95
·
Failed
·

Upload

Not measured yet. Vorla is static hosting with no endpoint that reads a POST body, so no upload figure is reported rather than a made-up one.

Source file: /bench/speed-test/payload.bin, pulled over 3 parallel streams. Your results are calculated inside this page and are never uploaded or stored anywhere.

What the download test actually measures

Three streams, a discarded warm-up, and two hard caps. Here is every one of them.

The download figure is bytes delivered to this page, divided by wall-clock seconds. Three fetch() requests pull payload.bin at once and each response is read through response.body.getReader(), so every chunk is counted the moment it arrives. That is why the graph fills in progressively instead of appearing at the end: the number is a rolling two-second average, not one big division at the finish line.

The first 600 ms of the run is thrown away. A fresh TCP connection starts in slow start with a tiny congestion window and doubles it every round trip, TLS costs another handshake, and the CDN may need a moment to find the file. Measuring through that ramp would drag the result down by a third or more on a fast link. On a very fast link the opposite problem appears, 600 ms being most of the budget, so the warm-up also ends early once 5 MB have moved, whichever comes first.

"Three parallel connections" is not literally true over HTTP/2, and that matters. Cloudflare serves this site over HTTP/2 or HTTP/3, so the three requests are three multiplexed streams sharing one connection, not three independent TCP flows. More streams still means more data in flight and a fuller pipe, which is why one stream under-reports, but a native speed test opening six real sockets to a nearby server has a genuine advantage this page cannot match. The gap is usually small on a home connection and large on a very fast one.

The 25 MB cap, and what it costs you. Bandwidth is not free, not for the person running the test on a metered phone and not for the site serving the file. So this test stops at 25 MB, or 15 seconds, or as soon as the rolling estimate holds within 5 percent for a second and a half, whichever comes first. A typical home connection settles long before any cap and uses 8 to 15 MB.

The arithmetic of that decision, stated plainly: after warm-up there are about 20 MB left to measure, which is 160 megabits. A 50 Mbps line gets a comfortable three-second window. A 160 Mbps line gets exactly one second. A gigabit line gets about 0.16 s, which is not enough time for the transfer to reach full speed, let alone hold steady. So above roughly 150 Mbps this page reports a lower bound, and on a gigabit connection it will typically read somewhere between 300 and 700 Mbps on a line that is genuinely fine. The page flags this on screen when it happens rather than quietly printing the small number.

What the ping test actually measures

An HTTP round trip, one probe at a time, with nothing served from a cache.

This is an HTTP round trip, not an ICMP ping. A browser has no way to send an ICMP echo packet: that is a raw-socket operation the sandbox does not expose, and no amount of JavaScript changes it. So each probe is a real HEAD request whose round trip is timed with performance.now(). That trip carries the TLS record layer, HTTP framing, and however long the server takes to answer, so it reads a few milliseconds higher than ping would to the same machine. We would rather say that plainly than print a number that quietly is not what it claims to be.

The useful part is that the overhead is roughly constant. It sits underneath every sample equally, so it shifts the whole distribution a little to the right and leaves its shape untouched. Everything this page cares about most, jitter and the size of the tail and whether spikes arrive on a clock, is a statement about the differences between samples, and those differences survive the overhead intact.

Probes are sent one at a time, never in parallel. Fire ten requests at once and they queue on the same connection; the tenth waits for the nine in front of it and reports that queue as latency. It would look like a network problem you do not have. Each probe waits for the previous one to finish. The quick test then leaves a fixed 130 ms gap; the stability test instead places each probe on a 250 ms grid measured from the moment the run started, so a slow probe does not push every later one further behind and the spike-interval maths stays meaningful.

The clock is not infinitely fine, so the numbers are not printed as if it were. Browsers deliberately coarsen performance.now() to blunt timing attacks, roughly 100 microseconds in Chromium and a full millisecond in Firefox and Safari. Figures here are shown to one decimal place below 100 ms and to the nearest millisecond above it. Averaging many samples does genuinely recover some resolution below the clock's step, which is why the median and jitter are still worth a decimal, but a second one would be decoration.

Nothing is served from a cache. This site installs a service worker that answers same-origin GET requests from Cache Storage. If the probes were plain GETs they would be answered from your own disk in well under a millisecond and the page would confidently report a fantasy. Two things prevent that: the probe is a HEAD, which the service worker deliberately ignores, and the request is issued with cache: no-store so the browser's own HTTP cache cannot answer either. If a fallback path ever has to use GET, it carries a unique query string and a Range header so the response is a 206, which the Cache API is required by spec to refuse to store.

A failed probe is not the same as a lost packet. TCP retransmits lost packets invisibly, so a single dropped packet normally shows up here as one slow sample rather than a failure. A probe only counts as failed when nothing came back at all, or, on a request the network refuses outright, as soon as it is refused. The waiting limit is six seconds until five samples exist and nothing about your line is known yet; after that it becomes twelve times your own median, floored at two seconds and still capped at six. Scaling it matters: a fixed six seconds would let a line that dies part-way through a sixty-second run burn a tenth of the run on a single dead probe, and it would let a 200 ms dropout on a 15 ms line masquerade as a healthy sample. If nothing answers at all from the start, the run gives up after three silent probes rather than making you sit through the rest of it. The consequence is that the failed figure is a far harsher signal than a packet-loss percentage from a native tool: one failure in sixty is already worth investigating, and it usually means a link is dropping out rather than merely dropping packets.

Upload is not measured, and here is why. Measuring upload needs a server that will accept a POST and read the whole body. Vorla is static hosting, so it answers a POST with an error and there is nothing to time. The download test sends an 8 KB probe to a URL that does not exist, purely to find out whether this host would accept a POST at all, and then tells you it failed rather than inventing a number.

What counts as a good number

Latency and jitter are separate questions, and jitter is the one people ignore.

Latency

Round tripVerdictWhat it means
Under 20 msExcellentA short physical path. Everything feels instant.
20 to 50 msGoodA normal, healthy figure for a home line reaching a nearby edge.
50 to 100 msPlayableFine for most games and every kind of browsing.
Over 100 msIt hurtsShooters and fighting games start to feel wrong.

Jitter

VariationVerdictWhat it means
Under 5 msSmoothVoice chat and game netcode both have an easy time.
5 to 20 msAudibleYou can hear it in voice chat. Games survive it.
Over 20 msBurstyPackets arrive in clumps, and no amount of bandwidth fixes that.

So the useful reading of this page is three questions. Is the download roughly what you pay for, is the median latency under about 40 ms, and is the jitter in single digits? If all three are true the connection is healthy and any remaining slowness lives somewhere else.

Why more Mbps does not fix lag

Bandwidth is how much fits down the pipe. Latency is how long one thing takes to get there and back.

What sets your latencyCostDetail
Distanceabout 1 ms per 100 kmLight in fibre covers about 200,000 km per second, so a server 2,000 km away cannot be faster than about 20 ms, ever. Real routing is never the straight line on the map. No product fixes this; you pick a closer server instead.
Last-mile technologyfibre 1 to 2 ms, satellite 480 ms and upCable adds a few milliseconds, DSL more again, 4G typically 30 to 50 ms and 5G rather less. A geostationary satellite link has a hard physical floor near 480 ms, four trips through 35,786 km of vacuum, and lands closer to 600 ms in practice. Low-earth-orbit services land around 25 to 60 ms with visible variance as satellites hand over.
Wi-Fi2 ms to over 100 msA good 5 GHz link costs a couple of milliseconds. A congested 2.4 GHz channel with retries costs anything from 5 ms to well over 100 ms, arriving unpredictably. This is the biggest single thing most people can actually change.
Queueing on your own line20 ms becomes 300 ms under loadBuffer bloat. This is the one that makes latency triple the moment somebody starts an upload, and the one that smart queue management fixes.

This is the single most expensive misunderstanding in home networking, and ISPs are not in a hurry to correct it. Bandwidth is how much fits down the pipe each second. Latency is how long one thing takes to get there and come back. They are close to independent. A competitive shooter sends packets of a couple of hundred bytes, sixty or more times a second, on the order of a hundred kilobits per second in total. It has never once been limited by your 500 Mbps line, and upgrading to 1000 will change precisely nothing about how it feels.

Loading a page means a DNS lookup, a TCP handshake, a TLS handshake and then the request: four or more round trips before the first byte of content. At 15 ms that is invisible. At 150 ms the same page feels sluggish on a gigabit line, because the delay is in the waiting, not the transferring. Going from 50 to 500 Mbps changes nothing about that; halving the latency changes everything.

Jitter deserves its own paragraph because it hurts more than raw latency and gets far less attention. Voice chat and game netcode both handle a constant delay gracefully: the client predicts, the codec buffers, and everything feels fine. Neither handles a delay that changes packet to packet. A voice application responds by growing its de-jitter buffer, which adds latency to absorb the variance, so high jitter turns into audible delay and then into the chopping everyone recognises. Game netcode responds by mispredicting, which is the rubber-banding you feel as lag even though the average ping never moved.

Buffer bloat, and the one router setting worth changing. Every device on the path keeps a queue of packets waiting for their turn on the wire. For years the industry made those queues enormous, on the theory that a dropped packet is worse than a delayed one. It is not. When you start a large upload, TCP does exactly what it is designed to do and speeds up until something pushes back, and a huge queue does not push back, it just fills. Now the queue holds several seconds of data, and every game packet, DNS lookup and voice frame waits behind all of it. Idle latency of 20 ms becomes 300 ms under load, and no amount of extra bandwidth helps, because the pipe is not full, the queue is.

The fix is smart queue management, sold as SQM, QoS, Smart Queues or Adaptive QoS depending on the firmware. It is standard in OpenWrt and now common in stock firmware from most vendors. Turn it on and set the limits to roughly 90 to 95 percent of your real measured line speed in each direction: the shaper has to be the slowest point on the path, otherwise your ISP's oversized buffer stays in charge. Done correctly, latency under full load stays within a few milliseconds of idle. Run the download test in another tab while the stability test is running: if latency triples, that is buffer bloat and you have found your fix.

And then there is the cable. A wired connection resolves more lag complaints than any other single change, by a wide margin. Wi-Fi is a shared radio: only one device on a channel transmits at a time, everything retries when a frame collides, power saving parks the radio between packets to save battery, and the access point periodically stops serving you to scan other channels. Every one of those is a spike, and none of them exists on Ethernet. If a cable is genuinely impossible, the ranked next-best options are: move to 5 GHz or 6 GHz, pick a clear channel, move closer to the access point, and turn off Wi-Fi power saving on the client. Powerline adapters and mesh nodes with no wired backhaul both usually make jitter worse, not better.

Reading the shape of the distribution

The histogram does more work than the headline number. Averages hide exactly the behaviour that ruins games and calls.

  • One tight cluster

    A healthy line. The path is stable, nothing is queueing, and whatever the median says is genuinely what every packet gets.

  • A long tail to the right

    Queueing, either buffer bloat on your own connection or congestion upstream. If it only appears while something is uploading or downloading, it is yours to fix. On an idle line it is upstream and out of your hands.

  • Regular spikes at even intervals

    Almost always Wi-Fi. A radio problem repeats on a clock and congestion does not, which is exactly what the stability test measures.

  • Two separate clusters

    Two humps 30 ms or more apart normally means two paths: a laptop drifting between access points, a phone handing between Wi-Fi and mobile data, or a VPN that only some connections go through.

  • A staircase that climbs and stays

    Something started while you were measuring: a game updating, a cloud sync waking up, a backup, or another device. The fix is to find the culprit, not to change the router.

When the number looks wrong

Speed tests are diagnostic, not decorative. Work down this list before calling the ISP, because in practice the fault is almost never the line.

SymptomReadingWhat to do
Well below what you pay for, and worse on Wi-FidownloadWi-Fi is the bottleneck far more often than the internet is. A router advertising 1200 Mbps is quoting the sum of both radio bands under laboratory conditions. Two walls, a 2.4 GHz-only client, or a neighbour on the same channel and you are realistically looking at 40 to 80 Mbps. Run the test once on Ethernet: if the wired number is fine, the problem is radio, not the ISP.
A flat ceiling at about 94 MbpsdownloadOld hardware caps you before the line does. A five-year-old phone, a 100 Mbps switch port, a cheap powerline adapter or a Wi-Fi 4 laptop all top out well under a modern connection, and a 100 Mbps Ethernet port reads as a suspiciously exact 94 Mbps. That flat ceiling is the giveaway.
Halved throughput and doubled latencydownloadVPNs, proxies and security suites re-encrypt every byte and add a detour through another continent. Turn it off and re-test before blaming anything else.
Fine yesterday, poor todaydownloadSomething else is using the connection. Console and game-launcher updates are the classic culprit because they deliberately saturate the link, and so does a cloud backup, and so does anyone else in the house.
Download collapses and latency goes through the roofdownloadYour upload is saturated. Downloads need acknowledgements to travel back upstream, so a backup pinning your upload takes the download with it. A classic asymmetric-line failure that looks like a mystery until you notice the latency figures moved too.
High median, low jitter, no spikeslatencyDistance and last-mile technology, not a fault. Nothing on your side will fix it. Pick servers in a closer region, and check which edge answered.
Low median, high jitter, regular spikeslatencyWi-Fi, with high confidence. Plug in a cable and re-run the test. If the spikes vanish, you have your answer in under a minute.
Fine when idle, terrible under loadlatencyBuffer bloat. Enable SQM or QoS on the router and shape to slightly under your real line speed. No amount of extra bandwidth fixes an over-full queue.
Latency climbs and stays climbedlatencySomething started competing for the line. Check for game and OS updates, cloud sync, backups, a TV streaming in another room, and anything on a schedule.
Failed probeslatencySomething is dropping out rather than slowing down. Test on a cable to rule out radio, then check for a failing cable or port, an overheating router, DNS problems, or an ISP fault worth reporting. A stability run with a failure count is exactly the evidence support desks ask for.
Everything looks fine here but one site or one game is sloweitherThen it is not your connection, it is that route or that server. This test only ever proves the path between you and one CDN edge. Run it again during the bad period: a connection that is clean while the game stutters is genuinely useful information.

How the stability grade is worked out

Four sub-scores out of 100 and a weighted blend, all four printed on screen so the letter can be checked rather than trusted.

GradeScoreReads as
A+93 to 100Rock solid.
A84 to 92Stable, minor wobble only.
B73 to 83Mostly stable, with rough edges you would notice occasionally.
C61 to 72Inconsistent. You would feel this in a game.
D45 to 60Unstable. This is a real problem, not a perception one.
Funder 45Badly unstable. Work through the notes.
PartWeightFull marksZero
Jitter35%2 ms or less30 ms or more
Tail (p95 minus median)30%5 ms or less120 ms or more
Failed probes15%none5% or more
Baseline latency20%30 ms or less250 ms or more

A run that steps to a worse level and then holds it is, by every measure above, perfectly steady. So a run whose last third is materially worse than its first third is capped at 78 and told that it was capped, rather than being called rock solid directly above a sustained-degradation note.

Latency to a CDN edge is not latency to a game server

The chip under the round-trip readout shows which Cloudflare datacentre answered your probes, read from /cdn-cgi/trace on this site. The three-letter code is an IATA airport code for the building. A large CDN runs hundreds of these and steers you to a nearby one, which is why a good result here can be in single-digit milliseconds: you may be measuring a round trip to a rack a few kilometres away.

Your game server is not in that rack. It is in whichever region the publisher chose, it is reached over paths a CDN has spent a fortune optimising and your game has not, and it is doing real work before it answers. So expect your in-game ping to be higher than the number on this page, often much higher, and treat this figure as the floor your connection is capable of rather than a prediction. What transfers cleanly between the two is everything about consistency: if this page shows 8 ms of jitter and spikes every twelve seconds, your game is getting the same treatment, whatever its absolute ping happens to be.

If you need the actual latency to a specific game server, a browser cannot get it for you and no browser tool honestly can. The server is on a different origin with no CORS headers you may use, most game servers speak UDP rather than HTTP, and many do not answer ICMP at all. Use the in-game network overlay if there is one, or a native tool: ping and tracert on Windows, ping and mtr on Linux and macOS. mtr is the one worth learning, because it pings every hop on the path continuously, so you can see which router the loss or the delay starts at instead of only that it exists somewhere.

How to run it, and how to read the result

Running the download test

  1. Get off Wi-Fi if you can. If you want to know what the line does, test on Ethernet. If you want to know what your laptop gets, test where you actually sit. They are different questions and they give different answers.
  2. Stop other traffic first. A game updating, a cloud sync, someone else streaming: all of it comes out of the same pipe and all of it shows up in this number.
  3. Leave the tab in front. Background tabs get throttled, so the test stops itself rather than reporting a number it collected while nobody was looking.
  4. Read the big number as Mbps and the small one as MB/s. They are the same speed: Mbps divided by 8 is MB/s. ISPs sell megabits, download managers show megabytes, and that factor of eight is the single most common misreading of any speed test. 100 Mbps is 12.5 MB/s, not 100.
  5. Look at the stop reason. "estimate stable" means the test saw a steady number and quit early. "data cap" or "15 s limit" means it ran out of budget first, and on a fast line that makes the download figure a floor rather than a measurement.

Running the ping test

  1. The quick test runs 25 timed round trips. Two extra warm-up probes run first and are thrown away, because the first request after an idle moment may have to rebuild the TCP and TLS connection and would read tens of milliseconds high.
  2. Read the median, not the mean. The median is the middle sample: one unlucky 400 ms outlier barely moves it, while it drags the mean somewhere no packet actually went. When the two disagree badly, the mean is telling you there is a tail.
  3. Read the spread, not just the middle. Min is what the line does when nothing is in the way, which is your physical floor. p95 is what one packet in twenty actually experiences. A wide gap between them is exactly what makes a game feel inconsistent while the average looks perfectly healthy.
  4. Check jitter. Jitter here is the mean absolute difference between one sample and the next, skipping any pair with an unanswered probe between them. A gap of several seconds is not packet-to-packet variation and it would not be honest to count it as one. Voice chat and game netcode both budget for a steady delay and cope badly with a delay that changes on every packet, which is why 60 ms of rock-steady latency beats 30 ms that keeps moving.
  5. Then run the 60-second stability test. That is the one that answers why your game lags sometimes. A five-second test cannot see a spike that happens once a minute, and once a minute is enough to lose a fight.
  6. Read the verdict, not only the grade. Periodic spikes, sustained degradation and failed requests are listed separately on purpose: they have different causes and completely different fixes, and a single letter cannot tell them apart.

Questions

Why is this slower than the speed my ISP advertises?

Advertised speeds are a ceiling for the line into your building, not a promise for one browser tab. Between that line and this page sit your Wi-Fi, your router, the CPU decrypting TLS, the path to the CDN edge that serves the file, and everything else on your network using bandwidth right now. A result 10 to 20 percent under the advertised number on Wi-Fi is normal. A result at a third of it usually means Wi-Fi, not the line.

How much data does this test use?

At most 25 MB, and usually far less. The download stops as soon as the rolling estimate holds steady within 5 percent for a second and a half, so a typical run on a home connection transfers 8 to 15 MB. The latency probes add about 20 requests of a single byte each. The page shows exactly how much it used when the run ends.

What counts as a good ping and a good jitter?

Under 20 ms is excellent, 20 to 50 ms is good, 50 to 100 ms is playable for most games, and over 100 ms starts to hurt in shooters and fighting games. Jitter matters just as much: under 5 ms is smooth, 5 to 15 ms is audible in voice chat, and over 20 ms means packets are arriving in bursts and no amount of bandwidth will make the game feel smooth. A steady 60 ms feels far better than a 30 ms line that jumps to 200 ms every few seconds. Remember that this page measures the round trip to a CDN edge near you, not to the game server you actually play on.

Why can this page not measure my upload speed?

Measuring upload needs a server that will accept a POST and read the whole body. Vorla is static hosting, so it answers a POST with an error and there is nothing to time. The page tries anyway and tells you it failed rather than inventing a number, because an upload figure derived from a rejected request would be fiction.

Why does a browser speed test give a different number to a native app?

A native test opens several real TCP connections, often to a server picked for being close to you, and it does not pay for TLS inside a JavaScript engine. This page fetches one file over three HTTP/2 streams that share a single connection, decrypts it in the browser, and counts the bytes the page actually received. That is a fair measure of what a web page can pull, which is what most people care about, but it reads lower than a tuned native test on a fast line.

The test says my connection is fast but everything still feels slow. Why?

Throughput is only one of three numbers. Latency decides how long anything takes to start, jitter decides whether calls and streams stutter, and packet loss decides whether they stall completely. A 500 Mbps line with 120 ms of latency feels worse for browsing and gaming than a 50 Mbps line with 15 ms. If throughput looks fine and the internet still feels bad, look at the latency and jitter figures, and at whatever else on your network is saturating the upload.

Why is my ping in game higher than the number on this page?

Because this page measures the round trip to the nearest Cloudflare edge, which is usually a datacentre in or near your own city, while a game server may be hundreds or thousands of kilometres away. Fibre costs roughly 1 ms of round trip for every 100 km of distance, and every router on the path adds a little more. Treat the number here as the floor your connection can reach, not as the ping you will see in a match.

Why does this show a different number than the ping command?

A browser cannot send ICMP echo packets, which is what the ping command uses, so this test times a real HTTP request instead. That round trip also carries HTTP framing, TLS session resumption and the time the server spends answering, so it reads a few milliseconds higher than a native ping to the same machine. The variation between samples, which is what jitter and stability actually measure, is unaffected by that constant overhead.

What causes ping spikes every few seconds?

Regular, evenly spaced spikes are almost always Wi-Fi. Access points periodically scan other channels, power saving parks the radio between packets, and a neighbour on the same channel forces retries. Bluetooth, USB 3 enclosures and microwave ovens all crowd the 2.4 GHz band and produce the same pattern. Plugging in an Ethernet cable removes every one of those causes at once.

Will faster internet fix my lag?

Almost never. Bandwidth is how much data fits down the pipe each second, latency is how long one packet takes to get there and back, and a game sends tiny packets many times a second. Going from 100 Mbps to 1000 Mbps changes nothing about the distance to the server or the number of routers on the way. The one bandwidth-shaped cause of lag is congestion: when something on your network saturates the upload, latency climbs, and that is buffer bloat rather than a lack of speed.

What is buffer bloat and how do I fix it?

Network equipment keeps a queue of packets waiting to be sent. When that queue is far larger than it needs to be, one big upload fills it with megabytes of data and every later packet has to wait behind all of it, so latency under load climbs from 20 ms to several hundred. The fix is smart queue management, sold as SQM, QoS or Smart Queues in router firmware. Turn it on, set it slightly below your real line speed, and latency under load usually falls back to near idle.