App::SpeedTest(3)

πŸ“¦ version 0.31, in alpine 3.24

πŸ’– App::SpeedTest πŸ’–

okay so bestie, quick vibe check: this is a manpage from the User Contributed Perl Documentation section, and its whole name-title situation is App::SpeedTest β€” that's what we're reading today, and honestly? it's giving "useful little tool that absolutely ate." πŸ’… Let's get into it.


🌸 NAME 🌸

App::SpeedTest β€” a command-line interface to speedtest.net. yes, the actual speedtest dot net. from your terminal. no flash, no browser, no nonsense. ✨


✨ SYNOPSIS ✨

$ speedtest [ --no-geo | --country=NL ] [ --list | --ping ] [ options ]

$ speedtest --list
$ speedtest --ping --country=BE
$ speedtest
$ speedtest -s 4358
$ speedtest --url=http://ookla.extraip.net
$ speedtest -q --no-download
$ speedtest -Q --no-upload

like, that's the whole energy right there β€” pick your server sitch, and go πŸƒβ€β™€οΈπŸ’¨


πŸ’œ DESCRIPTION πŸ’œ

okay so the provided perl script is a command-line interface to the speedtest.net <http://www.speedtest.net/> infrastructure, and the whole point is that flash is not required πŸ˜ŒπŸ¦‹

basically it was written to feature the functionality that speedtest.net offers β€” but without the overhead of flash or java, and without needing a browser at all. iconic behavior, no cap. πŸ‘‘


πŸ¦‹ Raison-d'Γͺtre πŸ¦‹

the whole reason this tool exists: it's here to give you a quick indication of the achievable throughput of your current network. and ngl, that throughput can drop dramatically if you're behind (several) firewalls, or badly configured networks β€” or network parts like switches, hubs and routers. πŸ’€ like, the vibes can be immaculate on paper and then your actual speed is in shambles.

it was inspired by speedtest-cli <https://github.com/sivel/speedtest-cli>, a project written in python. but β€” and I say this with love β€” I neither like python, nor did I like the default behavior of that script. πŸ™ˆ I also think it does not take the right decisions in choosing the server based on distance instead of speed. and that actually matters if one has fiber lines, bestie. I prefer speed over distance, periodt. πŸ”₯


πŸŽ€ Command-line Arguments πŸŽ€

okay, here's the whole menu. every single one, no skipping πŸ‘‡

  • -?, --help β€” show all available options, then exit. the "help me help you" button 🫢
  • -V, --version β€” show program version and exit. identity check πŸ’…
  • --man β€” show the builtin manual using pod2man and nroff. the fancy formatted one 🌸
  • --info β€” show the builtin manual using pod2text. the plain-text one πŸŽ€
  • -v[#], --verbose[=#] β€” set verbose level. the default value is 1, and a plain -v without a value will set the level to 2. louder = more tea β˜•
  • --simple β€” an alias for -v0. quiet queen energy 🀫
  • --all β€” no (default) filtering on available servers. super useful when finding servers outside of the country of your own location. the passport-free option 🌍
  • -g, --geo β€” use GEO-IP service to find the country your ISP is located. the default is true. if you disable it (--no-geo), the server to use will be based on distance instead of on latency. choose your fighter βš”οΈ
  • -cXX, --cc=XX, --country=XX β€” pass the ISO country code to select the servers πŸ—ΊοΈ
$ speedtest -c NL ...
$ speedtest --cc=B ...
$ speedtest --country=D ...
  • --list-cc β€” fetch the server list and then show the list of countries the servers are located with their country code and server count. it's literally a world tour in list form ✈️
$ speedtest --list-cc
AD Andorra                             1
AE United Arab Emirates                4
:
ZW Zimbabwe                            6

you can then use that code to list the servers in the chosen country, as described below. iykyk 😌

  • -l, --list β€” this option will show all servers in the selection with the distance in kilometers to the server. cute little table, very demure πŸŽ€
$ speedtest --list --country=IS
  1: 10661 - Tengir hf              Akureyri    1980.02 km
  2: 21605 - Premis ehf             ReykjavΓ­k   2039.16 km
  3:  3684 - Nova                   Reykjavik   2039.16 km
  4:  6471 - Gagnaveita Reykjavikur Reykjavik   2039.16 km
  5: 10650 - Nova VIP               Reykjavik   2039.16 km
  6: 16148 - Hringidan              Reykjavik   2039.16 km
  7:  4818 - Siminn                 Reykjavik   2039.16 km
  8: 17455 - Hringdu                ReykjavΓ­k   2039.16 km
  9:  4141 - Vodafone               ReykjavΓ­k   2039.16 km
 10:  3644 - Snerpa                 Isafjordur  2192.27 km
  • -p, --ping, --ping=40 β€” show a list of servers in the selection with their latency in ms. ⏱️ be very patient if running this with --all β€” like, go make a snack, bestie πŸ“
$ speedtest --ping --cc=BE
  1:  4320 - EDPnet               Sint-Niklaas     148.06 km      52 ms
  2: 12627 - Proximus             Brussels         173.04 km      55 ms
  3: 10986 - Proximus             Schaarbeek       170.54 km      55 ms
  4: 15212 - Telenet BVBA/SPRL    Mechelen         133.89 km      57 ms
  5: 29238 - Arcadiz              DIEGEM           166.33 km      58 ms
  6:  5151 - Combell              Brussels         173.04 km      59 ms
  7: 26887 - Arxus NV             Brussels         173.04 km      64 ms
  8:  4812 - Universite Catholiq… Louvain-La-Neuv  186.87 km      70 ms
  9:  2848 - Cu.be Solutions      Diegem           166.33 km      75 ms
 10: 12306 - VOO                  Liège            186.26 km      80 ms
 11: 24261 - Une Nouvelle Ville…  Charleroi        217.48 km     147 ms
 12: 30594 - Orange Belgium       Evere            169.29 km     150 ms

if a server does not respond, a very high latency is used as default. rude of the server, honestly πŸ™„

this option only shows the 40 nearest servers. the number can be changed as optional argument 🎚️

$ speedtest --cc=BE --ping=4
  1:  4320 - EDPnet               Sint-Niklaas     148.06 km      53 ms
  2: 29238 - Arcadiz              DIEGEM           166.33 km      57 ms
  3: 15212 - Telenet BVBA/SPRL    Mechelen         133.89 km      62 ms
  4:  2848 - Cu.be Solutions      Diegem           166.33 km      76 ms
  • -1, --one-line β€” generate a very short report easy to paste in e.g. IRC channels. tiny, punchy, perfect for the group chat πŸ’¬
$ speedtest -1Qv0
DL:   40.721 Mbit/s, UL:   30.307 Mbit/s
  • -B, --bytes β€” report throughput in Mbyte/s instead of Mbit/s. bytes girlies rise 🧚
  • -C, --csv β€” generate the measurements in CSV format. the data can be collected in a file (by a cron job) to be able to follow internet speed over time. spreadsheet slay πŸ“Šβœ¨

the reported fields are:

  • A timestam (the time the tests are finished)
  • The server ID
  • The latency in ms
  • The number of tests executed in this measurement
  • The direction of the test (D = Down, U = Up)
  • The measure avarage speed in Mbit/s
  • The minimum speed measured in one of the test in Mbit/s
  • The maximum speed measured in one of the test in Mbit/s
$ speedtest -Cs4358
"2015-01-24 17:15:09",4358,63.97,40,D,93.45,30.39,136.93
"2015-01-24 17:15:14",4358,63.97,40,U,92.67,31.10,143.06
  • -U, --skip-undef β€” skip reporting measurements that have no speed recordings at all. the default is to report these as 0.00 .. 999999999.999. yeah, that's the whole range, don't ask 😭
  • -P, --prtg β€” generate the measurements in XML suited for PRTG 🧾
$ speedtest -P
<?xml version="1.0" encoding="UTF-8" ?>
<prtg>
  <text>Testing from My ISP (10.20.30.40)</text>
  <result>
    <channel>Ping</channel>
    <customUnit>ms</customUnit>
    <float>1</float>
    <value>56.40</value>
    </result>
  <result>
    <channel>Download</channel>
    <customUnit>Mbit/s</customUnit>
    <float>1</float>
    <value>38.34</value>
    </result>
  <result>
    <channel>Upload</channel>
    <customUnit>Mbit/s</customUnit>
    <float>1</float>
    <value>35.89</value>
    </result>
</prtg>
  • --url[=XXX] β€” with no value, show server url in list. πŸ”— with a value, use that specific server url: it will not scan available servers. main character server selection 🎯
  • --ip β€” show IP for server. who are you really πŸ‘€
  • -T[#], --try[=#] β€” use the top # (based on lowest latency or shortest distance) from the list to do all required tests. the "give me options" mode πŸ†
$ speedtest -T3 -c NL -Q2
Testing for 80.x.y.z : XS4ALL Internet BV (NL)

Using 13218:  26.52 km      25 ms XS4ALL Internet BV
Test download ..                                      Download     31.807 Mbit/s
Test upload   ..                                      Upload       86.587 Mbit/s

Using 15850:  26.09 km      25 ms QTS Data Centers
Test download ..                                      Download     80.763 Mbit/s
Test upload   ..                                      Upload       77.122 Mbit/s

Using 11365:  26.09 km      27 ms Vancis
Test download ..                                      Download    106.022 Mbit/s
Test upload   ..                                      Upload       82.891 Mbit/s

Rank 01: Server:  11365   26.09 km      27 ms,  DL:  106.022 UL:   82.891
Rank 02: Server:  15850   26.09 km      25 ms,  DL:   80.763 UL:   77.122
Rank 03: Server:  13218   26.52 km      25 ms,  DL:   31.807 UL:   86.587

$ speedtest -1v0 -T5
DL:  200.014 Mbit/s, UL:  159.347 Mbit/s, SRV: 13218
DL:  203.599 Mbit/s, UL:  166.247 Mbit/s, SRV: 15850
DL:  207.249 Mbit/s, UL:  134.957 Mbit/s, SRV: 11365
DL:  195.490 Mbit/s, UL:  172.109 Mbit/s, SRV: 5972
DL:  179.413 Mbit/s, UL:  160.309 Mbit/s, SRV: 2042

Rank 01: Server:  15850   26.09 km      30 ms,  DL:  203.599 UL:  166.247
Rank 02: Server:   5972   26.09 km      32 ms,  DL:  195.490 UL:  172.109
Rank 03: Server:  13218   26.52 km      23 ms,  DL:  200.014 UL:  159.347
Rank 04: Server:  11365   26.09 km      31 ms,  DL:  207.249 UL:  134.957
Rank 05: Server:   2042   51.41 km      33 ms,  DL:  179.413 UL:  160.309
  • -s#, --server=#, --server=filename β€” specify the ID of the server to test against. this ID can be taken from the output of --list or --ping. using this option prevents fetching the complete server list and calculation of distances. it also enables you to always test against the same server. loyalty, but for servers 🫢
$ speedtest -1s4358
Testing for 80.x.y.z : XS4ALL Internet BV ()
Using 4358:  52.33 km      64 ms KPN
Test download ........................................Download:   92.633 Mbit/s
Test upload   ........................................Upload:     92.552 Mbit/s
DL:   92.633 Mbit/s, UL:   92.552 Mbit/s

this argument may be repeated to test against multile servers, more or less like specifying your own top x (as with -T). the more the merrier ✨

$ speedtest -s 22400 -s 1208 -s 13218
Testing for 185.x.y.z : Freedom Internet BV ()

Using 13218:  80.15 km      32 ms XS4ALL Internet BV
Test download ........................................Download    66.833 Mbit/s
Test upload   ........................................Upload     173.317 Mbit/s

Using  1208:  51.19 km      37 ms Qweb | Full-Service Hosting
Test download ........................................Download    52.077 Mbit/s
Test upload   ........................................Upload     195.833 Mbit/s

Using 22400:  80.15 km      46 ms Usenet.Farm
Test download ........................................Download    96.341 Mbit/s
Test upload   ........................................Upload     203.306 Mbit/s

Rank 01: Server:  22400   80.15 km      46 ms,  DL:   96.341 UL:  203.306
Rank 02: Server:   1208   51.19 km      37 ms,  DL:   52.077 UL:  195.833
Rank 03: Server:  13218   80.15 km      32 ms,  DL:   66.833 UL:  173.317

Okay so real talk about that filename β€” if you pass one, it's gotta look like the server-like structure you'd get from the speedtest server-list, maybe filled out with upload- and download URL's. And like: you can only pass one filename that isn't all digits. If you do pass one, every remaining "-s" argument just gets ignored. Sorry bestie, that's the rules πŸ’…

  {   cc      => "NL",
      country => "Netherlands",
      host    => "unlisted.host.amsterdam:8080",
      id      => 9999,
      lat     => "52.37316",
      lon     => "4.89122",
      name    => "Amsterdam",
      ping    => 20.0,
      sponsor => "Dam tot Damloop",
      url     => "http://unlisted.host.amsterdam/speedtest/speedtest/upload.php",
      url2    => "http://unlisted.host.amsterdam/speedtest/speedtest/upload.php",

      dl_list => [
          "http://unlisted.host.amsterdam/files/128.bin",
          "http://unlisted.host.amsterdam/files/256.bin",
          # 40 URL's pointing to files in increasing size
          "http://unlisted.host.amsterdam/files/2G.bin",
          ],
      ul_list => [
          # 40 URL's
          ],
      }
  • -t#, --timeout=# β€” sets the maximum timeout, in seconds. Tick tock ⏳
  • -d, --download β€” runs the download tests. This is the default unless --upload gets passed. ✨
  • -u, --upload β€” runs the upload tests. This is the default unless --download gets passed. 🫢
  • -q[#], --quick[=#], --fast[=#] β€” don't run the full test, bestie. The default test runs 40 tests, sorted on increasing test size (and thus test duration), and those longer tests can take forever on slow connections without adding any value 😭. The default value for -q is 20, but any value between 1 and 40 is allowed.
  • -Q[#], --realquick[=#] β€” same deal, don't run the full test. Again: the default test runs 40 tests, sorting on increasing test size (and thus test duration), and long(er) tests may take too long on slow connections without adding value. The default value for -Q is 10, but any value between 1 and 40 is allowed. ⚑
  • -mXX, --mini=XX β€” runs the speedtest on a speedtest mini server. 🧚
  • --source=XX β€” NYI, literally just mentioned for speedtest-cli compatibility. Don't come for me πŸ’€

🌈 EXAMPLES 🌈

See "SYNOPSIS" and Command-line arguments. That's the whole vibe, go look πŸ‘€


πŸ¦‹ DIAGNOSTICS πŸ¦‹

...

(Yeah. That's it. Iconic of them honestly.)


πŸ’€ BUGS and CAVEATS πŸ’€

Because of how the language is implemented, it may report speeds that are not consistent with the speeds reported by the web interface or other speed-test tools. No cap. Same energy for the reported latencies β€” those are not to be compared to the ones tools like ping report, so don't @ me πŸ™ˆ


πŸŽ€ TODO πŸŽ€

Improve documentation

What did I miss? 😭

Enable alternative XML parsers

XML::Simple is not the recommended XML parser, but it sufficed on startup. All the other API's are more complex. It's giving "it works, leave it alone" 🫠


⭐ PORTABILITY ⭐

Perl has been ported to a whole plethora of operating systems, so this CLI will work fine on all systems that fulfill the requirement as listed in Makefile.PL (or the various META files). Slay, cross-platform queen πŸ‘‘

The script has been tested on Linux, HP-UX, AIX, and Windows 7. Aged like fine wine, fr fr.

Debian wheezy will run with just two additional packages:

# apt-get install libxml-simple-perl libdata-peek-perl

πŸ”₯ SEE ALSO πŸ”₯

As an alternative to speedtest.net <http://www.speedtest.net/>, you could consider <http://compari.tech/speed>.

And the speedtest-cli <https://github.com/sivel/speedtest-cli> project β€” the one that inspired me to improve a broken CLI written in python into our beloved language Perl. Character development at its finest πŸ’œ


🌸 CONTRIBUTING 🌸

General

I am always open to improvements and suggestions β€” use issues at github issues <https://github.com/Tux/speedtest/issues>. Come through! 🫢

Style

Heads up: I will never accept a pull request that does not strictly conform to my style, however much you might hate it. You can read the reasoning behind my preferences here <https://tux.nl/style.html>.

I really don't care about mixed spaces and tabs in (leading) whitespace. Lowkey generous of me ngl 😌


πŸ‘‘ WARRANTY πŸ‘‘

This tool is by no means a guarantee to show the correct speeds. It's only to be used as an indication of the throughput of your internet connection, and the values shown cannot be used in a legal debate. So don't bring these numbers to court, bestie β€” they will not hold up πŸ’…


πŸ“ AUTHOR πŸ“

H.Merijn Brand <linux@tux.freedom.nl> wrote this for his own personal use, but was asked to make it publicly available as application. Main character energy, honestly ✨


Copyright (C) 2014-2026 H.Merijn Brand

This software is free; you can redistribute it and/or modify it under the same terms as Perl itself.


And that's the whole page, bestie πŸŽ‰ This beauty shipped as perl v5.42.2 on 2026-03-15 β€” App::SpeedTest(3), go forth and speed-test responsibly βœ¨πŸ’…πŸ¦‹

πŸ“¦ where this page comes from