curl performance tests

curl/perf on GitHub
1524 builds
First2026-08-10 12:05:01 (local time)
Last2026-09-08 15:10:48 (local time)
Period29.1 days
Rendered2026-09-08 13:10:53 UTC
189 rounds
R188 easy: make ca_cache_timeout standalone (1 builds)
🔗 mbedtls: fix ticket handling
🔗 http2: changes in error handling
R187 GHA: start using `background: true` to parallelize job steps (2 builds)
R186 GHA/linux: enable egress firewall reporting in one job, disable MotD (2 builds)
R185 hsts: on load, only remove exact duplicates (1 builds)
R184 imap: compare selected mailbox names case-sensitively (2 builds)
R183 test1679: unset `SSL_CERT_FILE`, use `TESTNUMBER` (7 builds)
🔗 GHA/curl-for-win: upload artifact as `curl.exe` (without using zip)
R182 cshutdown: make it smaller (2 builds)
R181 ftp: URL encode file names when wildcarding (6 builds)
R180 tests: raise some alloc limits (3 builds)
R179 VERSIONS: add Rock-solid releases shipping today (3 builds)
R178 appveyor.yml: fix the yaml, use 'true' instead of 'yes' (1 builds)
R177 build: convert HAS_TIME_T_UNSIGNED to a compile-time check (10 builds)
🔗 perf: add maprintf and simpleformat printf tests
🔗 config2setopts: always set the security options for SCP/SFTP
R176 appveyor: save an artifact for the vs2026 debug build (16 builds)
R175 openssl: use non-deprecated API for MD5/MD4 (8 builds)
🔗 curl_fopen: restore the uid and gid checks
🔗 RELEASE-NOTES: synced
R174 tool: (re)set SSL verification in --libcurl output (1 builds)
🔗 getparam: switch off CONNECT headers when using -J
🔗 lib: rename curlx/fopen.[ch] to curlx/win32-fopen.[ch]
R173 cookie: ignore individual cookie errors when loading (6 builds)
🔗 test 4657: -J with multiple redirects, use the last name
🔗 digest.h: add forward declaration
R172 schannel: clear borrowed sslContext on close (8 builds)
R171 http: reject resumed uploads (9 builds)
R170 schannel: auto_client_cert conn matching (6 builds)
🔗 hash: select key operations by type
🔗 ftp: tighten use_ssl check for conn reuse
🔗 digest: parse without storing 'value' in local buffer
R169 tool_cb_wrt: inject the no-clobber number before the extension (3 builds)
R168 digest: fix maximum length quoted value parsing (1 builds)
R167 build: drop `HTTP_ONLY` option (2 builds)
🔗 digest: check peer equality for staleness
🔗 multi: reduce struct size with small cleanups
R166 ossl_verifyhost: remove assumption of null termination of ASN1_STRING. (1 builds)
🔗 openssl/gtls: reject CRLfile with native CA store, matching rustls
🔗 CURLOPT*ISSUERCERT*: not verified cryptographically
R165 connect: fix for first ms connection shutdown (1 builds)
R164 GHA: update dependency google/boringssl to v0.20260903.0 (1 builds)
🔗 HTTP-CONNECT: do not react to 401 responses
R163 uint-bset: skip unused slots when counting (18 builds)
🔗 multi: remove redundant completion message list
R162 multihandle: some easy shrinks (2 builds)
🔗 connectdata: use less curltime
R161 GHA/non-native: re-enable FreeBSD riscv64 (1 builds)
🔗 multi: store timeout epoch as whole seconds
R160 escape: polish encoding and decoding for speed (1 builds)
🔗 mprintf: stage output and emit it in runs
🔗 clang-tidy: merge nested `if()`s
R159 appveyor: fix description, drop redundant env (1 builds)
🔗 curl_addrinfo: drop redundant parentheses
🔗 warnless: dedupe Intel compiler warning suppression pragmas
🔗 global_init: tidy up, simplify, fix issues
🔗 multi_ntfy: replace enabled bitset with inline flags
🔗 runtests: Added runnernums in order to have O(1) lookup
R158 tool_cb_wrt: try up to .9999 when no-clobbering (1 builds)
🔗 RELEASE-NOTES: synced
R157 x509: stricter parsing (1 builds)
🔗 docs: add the missing .html to the url-encode book link
R156 tests/perf: split "percent" into urlencode + urldecode (8 builds)
🔗 clang-tidy: disable readability-redundant-parentheses
R155 perf/base64: split into separate encoding plus decoding tests (1 builds)
🔗 CURLOPT_SHARE.md: remove bad explanation for cookie sharing
R154 vquic: fix preprocessor check for old Darwin versions (8 builds)
🔗 test1399: improve reliability
R153 tests: Test certificates with embedded zero bytes (3 builds)
R152 doh: reject undersized HTTPS RDATA (2 builds)
🔗 vtls: fix Curl_cert_hostcheck when the pattern is not a C string
🔗 ngtcp2: shrink max sendbuf
👉 curl-8_22_0
🔗 RELEASE-NOTES: synced
🔗 VERSIONS: add 8.22.0 and the pending next release
🔗 THANKS: contributors from the 8.22.0 release
R151 clang-tidy: enable check `bugprone-assignment-in-selection-statement` (8 builds)
R150 doh: drop assert from doh_resp_decode_httpsrr() (7 builds)
R149 tidy-up: misc C and CMake nits (1 builds)
🔗 GHA: bump Actions and pips
R148 lib: expire/progress handling, do less clock calls (2 builds)
🔗 h2proxy: remember goaway "last_stream_id"
R147 perf/percent: basic percent encode/decode performance test (4 builds)
R146 sspi ambient user checks: remove again (1 builds)
R145 http2: remove assert in ingress processing (1 builds)
🔗 tool_doswin: fix stdin data truncation
R144 wcurl: import v2026.08.30 (1 builds)
R143 tidy-up: formatting, messages and comments (6 builds)
🔗 autotools: alpha-sort `ETAGS_ARGS` list
R142 perf: 0-pad the nanosecond decimals correctly (2 builds)
🔗 CURLOPT_USERNAME.md: ambient username caveats
R141 perf/urlparser: provide a built-in set of URLs (1 builds)
R140 perf: restore the -DDEBUGBUILD for debug builds (1 builds)
🔗 cf-socket: avoid broken NetBSD SOCK_NONBLOCK
R139 build: add performance tests (2 builds)
🔗 openssl: avoid strlen() on the data from OpenSSL
R138 transfer: DID handling (15 builds)
🔗 schannel: fix ALPN erroneously disabled
R137 curl_setup.h: merge two `#if` blocks (1 builds)
🔗 winsock: drop redundant version checks at initialization
R136 strings: add length to CURL_EASY_STR_SET() (2 builds)
R135 clock: save one call (1 builds)
R134 GHA/non-native: disable riscv64 FreeBSD job due to upstream issue (2 builds)
R133 gopher: fix partial sends of CRLF (1 builds)
R132 conncache: guess maxconnects different (1 builds)
R131 lib: drop unused `system_win32.h` includes (19 builds)
R130 easy_lock: silence `portability-no-assembler` with clang-tidy 23.1.0+ (13 builds)
🔗 easy: fix unused global on non-Windows
R129 tidy-up: drop redundant parentheses (1 builds)
R128 GHA/non-native: bump cross-platform-actions to 1.5.0 (3 builds)
R127 schannel: add ALPN support for mingw-w64 <9 and 🔗 sspi: add local helper macro to avoid UNICODE branching
🔗 spnego_sspi: drop redundant UNICODE branch
🔗 GHA: run on `curl-*` branches
R126 CI: add a test of labeler patterns (11 builds)
🔗 CI: add a test of Python code using pyrefly
🔗 tests: enable and fix some new Python ruff warnings
R125 conncache: lower limit for auto maxconnects (29 builds)
R124 distfiles.sh: check tarball for unexpected files (29 builds)
R123 cookie: cookies set for an exact PSL domain is host-only (1 builds)
R122 dist: fix to drop test bundle .c files from the source tarball (1 builds)
R121 HISTORY.md: PSL support in 2015 (1 builds)
R120 sspi: enable channel-binding in mingw-w64 <9 builds (4 builds)
R119 tool: checkfds, open on null device (8 builds)
🔗 include: include when building for modern Linux.
R118 RELEASE-NOTES: synced (1 builds)
🔗 schannel: clear PFX password before free
R117 os400: rewrite upper ebcdic wrappers using dynbuf (4 builds)
🔗 os400: port latest header files changes to ILE/RPG interface
🔗 ipv6 scope_id: set from first peer
🔗 share unlink: forget connection
🔗 mprintf: acknowledge %F
🔗 HISTORY: September 1999: started using CVS
R116 h2 push: use squeaky clean easy handle (6 builds)
R115 mprintf: avoid never-ending loop for positive-infinite (22 builds)
R114 schannel: refresh stream sizes after renegotiation (3 builds)
R113 connection reuse: check SSL configs when doing a scheme upgrade (6 builds)
R112 mprintf: fix long double output (1 builds)
R111 proxy: CONNECT trailers handling (4 builds)
R110 macos sectrust: fail ocsp verify when not builtin (1 builds)
🔗 CODE_STYLE.md: describe how we write typecasts
R109 setopt: allow setting a referer from CURLINFO_REFERER (5 builds)
🔗 multi: xfer table initial size and growth
R108 imap: APPEND CRLF fix (1 builds)
R107 Makefile.am: improve etags (8 builds)
🔗 cookie: improve TAB handling
🔗 libcurl.md: emphasize that the output needs checking
R106 ngtcp2: avoid NULL deref in cf_ngtcp2_send (2 builds)
R105 connection reuse: age check (2 builds)
R104 CURLOPT_SOCKOPTFUNCTION.md: ALREADY_CONNECTED does not work for HTTP/3 (16 builds)
R103 openssl: aws-lc ocsp workaround (2 builds)
🔗 http digest: tie peer/credentials on input
R102 wolfssl: do not run Curl_wssl_setup_x509_store() twice (14 builds)
R101 test322: fix for disabled-manual builds (1 builds)
🔗 scripts/testnum: provide a few available test numbers
R100 tool_paramhlp: --proto only supports one modifier (2 builds)
🔗 hsts: only match the exact strings
R99 setopt: make NULL `CURLOPT_AWS_SIGV4` disable aws-sigv4 auth (1 builds)
R98 build: fold lists to use one source filename per line (1 builds)
R97 tidy-up: minimum version comments and messages (1 builds)
🔗 tool_cb_hdr: do not truncate etags output to stdout
R96 GHA/checkdocs: verify examples with picky warnings enables, also with clang (1 builds)
R95 tests: support switching off the stdout redirect per-test (1 builds)
R94 quic: upload improvements (2 builds)
R93 cmake: check libgsasl version at configure time (2 builds)
R92 FAQ: correct an option typo (2 builds)
👉 rc-8_22_0-3
🔗 RELEASE-NOTES: synced
R91 urldata: sort the connectdata struct fields by size (2 builds)
R90 altsvc: continue after unknown parameters (16 builds)
R89 strcase: inline the raw case conversions (2 builds)
R88 vtls: move 'native_ca_store' ssl_config_data => ssl_primary_config (12 builds)
R87 openssl: avoid conn reuse if provider is used (1 builds)
🔗 GHA: update openssl/openssl to v4.0.2
R86 ngtcp2+openssL: fix early data (1 builds)
R85 openssl: no server cert is only okay if also not pinned (5 builds)
R84 Dockerfile: update debian:bookworm-slim Docker digest to 8820086 (4 builds)
🔗 cmake: optimize OpenSSL fork detection
🔗 cmake/FindLibgsasl: fix to set `LIBGSASL_VERSION` with pkg-config detection
R83 spnego_sspi: pass channel bindings on initial context (3 builds)
🔗 tool_doswin: don't use `TerminateThread` in stdin relay
R82 vtls_scache: use case sensitive path match (4 builds)
R81 protocol: simpler Curl_getn_scheme runs faster (18 builds)
R80 vssh: silence gcc-11 `-Wnull-dereference`, dedupe `CURL_EASY_STR()` calls (21 builds)
R79 circleci: bump images to their latest revision (3 builds)
🔗 circleci: update URL in comment, include in future URL checks
R78 lib: silence gcc-16 compiler warnings `-Wmaybe-uninitialized` (2 builds)
R77 RELEASE-NOTES: synced (29 builds)
🔗 docs: mention possible auth option conflicts
R76 tidy-up: fix typos in docs and comments (3 builds)
R75 cookie: allow loading cookies for localhost (1 builds)
R74 docs: remove doubled word in SECURITY-ADVISORY.md (14 builds)
R73 docs: make 5 example snippets compile cleanly with clang (76 builds)
R72 GHA: update dependency pizlonator/fil-c to v0.684 (24 builds)
R71 VERSIONS.md: document Rock-solid curl releases (23 builds)
R70 ws: fix write callback error handling (5 builds)
R69 GHA/checksrc: preprocess workflows to lint more shell code (34 builds)
🔗 u8_strset: start with 8 default entries
R68 GHA: install MSYS2 Perl manually for latest GitHub runners (5 builds)
R67 lib: new easy option string storage (1 builds)
🔗 openssl: fix DER buffer leak in Apple SecTrust verification
R66 ldap: base64-encode LDIF values beginning with colon or less-than (28 builds)
🔗 docs: connection reuse behavior for socket callbacks
R65 tool_msgs: make notef() respect --silent (4 builds)
R64 url: fix handling of empty user in ntml matching (16 builds)
R63 test_07_upload: skip tests if nghttpx lacks QUIC (3 builds)
R62 http: custom Authorization: header overrides Negotiate (51 builds)
R61 docs: clarify that cookies need domain set to match (2 builds)
R60 urldata: remove the aptr struct (45 builds)
R59 GHA: use `--subset` runtests option, run random subset in riscv64 job (47 builds)
R58 runtests: divide minimum required tests by subsets (1 builds)
R57 runtests: introduce a subset option (6 builds)
R56 runtests: allow resetting `CURL_TEST_MIN` via `--min=0` (2 builds)
R55 KNOWN_BUGS: remove old entries and NTLM related (3 builds)
R54 config-win32.h: drop UWP, c-ares, simplify more (2 builds)
R53 TODO: remove "Support MQTTS" (1 builds)
🔗 Happy Eyeballing v3: resolution delay of 25ms
R52 tests: fix Content-Length mismatch in test 2064 (10 builds)
R51 headers: name the arguments the way the definitions name them (23 builds)
R50 filter: change time reporting (2 builds)
R49 curlx_inet_pton: drop setting `errno` on error (13 builds)
R48 curlx_inet_ntop: return `CURLcode`, drop setting `errno` (2 builds)
👉 rc-8_22_0-2
R47 RELEASE-NOTES: synced (6 builds)
R46 multi: initialisation order (4 builds)
R45 urldata: drop four strings from the aptr struct (4 builds)
🔗 urldata: cleanups
🔗 scorecard: fix argument handling when count and parallel are both 1
R44 config-riscos.h: delete handcrafted RISC OS config header, in favor of autotools (42 builds)
🔗 GHA/non-native: sync BSD tflags logic with other workflows
R43 GHA/non-native: drop leftover perl5 install from riscv64 job [ci skip] (34 builds)
🔗 build: drop detecting `gettimeofday()` on Windows
R42 curl_threads: always use native threads/mutex on Windows (1 builds)
🔗 build: drop `dirent.h` and `opendir()` detections on Windows
R41 GHA/non-native: BSD build improvements (6 builds)
🔗 config-win32.h: limit use to MSVC IDE Project builds
R40 GHA/windows: bump stunnel to 5.80 (33 builds)
R39 multi: shrink expire timer indices (2 builds)
R38 GHA/non-native: sync BSD test exclusion logic with rest of workflows (1 builds)
R37 GHA/windows: log preinstalled MSYS2 packages (19 builds)
R36 file: support directory listing on Windows (12 builds)
🔗 connect: only set connect timer on first socket
R35 GHA/non-native: bump cross-build-actions, NetBSD 11.0, FreeBSD riscv64 (2 builds)
R34 multi: timeout improvements (38 builds)
R33 GHA/windows: install MSYS2 Perl manually on Windows 2025 runner (19 builds)
🔗 lib: optimize struct layouts for reduced memory usage
R32 connections: use admin handles only for maintenance (7 builds)
R31 Revert "uint-bset: add slot0 member" (1 builds)
🔗 multi: drop the assert from large expires
R30 multi: cap expire times to INT_MAX internally (9 builds)
🔗 RELEASE-NOTES: synced
R29 dict: avoid busy-loop in sendf() when the socket is not writable (1 builds)
R28 test_20_11: more leniency (2 builds)
R27 libcurl.pc: Add Copyright tag to the pkgconf file (43 builds)
R26 tool_operate: refactor schannel checks and move win32 cert checks to function (9 builds)
R25 conncache: don't assume curl_off_t increment wrap-around (5 builds)
R24 tool_operate: limit `is_using_schannel()` call to Windows (10 builds)
R23 cmake: use built-in variable and target property dump functions with CMake 4.5+ (3 builds)
R22 multihandle: move two struct fields (5 builds)
R21 multi: hold timeout values in 'int' instead of 'long' (26 builds)
R20 header api: add guards (6 builds)
🔗 uint-bset: add slot0 member
🔗 progress: fix progress meter update to run every second again
R19 url: fix negotiate/ntlm connection reuse (15 builds)
R18 mailmap: Ralf Mueller (2 builds)
🔗 tests: verify AWS SigV4 redirect auth scope
R17 tidy-up: C and CI (2 builds)
R16 progress: cleanup, less memory (2 builds)
R15 keylog: add a random size argument to Curl_tls_keylog_write() (1 builds)
R14 thrdqueue: drop name strdups from Curl_thrdq_create (1 builds)
R13 urlapi: avoid dedotdotify() if possible (2 builds)
🔗 tidy-up: comments and formatting
R12 CI: dump `libcurl.pc` (and `curl-config`) to log, verify `.pc` with `pccritic` tool (2 builds)
R11 build: strip empty properties from `libcurl.pc` (4 builds)
R10 configure: replace stray raw `grep` with `$GREP` (1 builds)
R9 tool_operate: only check for schannel if on windows (1 builds)
🔗 build: clear `Require.private` for static-only builds in `libcurl.pc`
R8 content_encoding: exact-match the identity transfer-coding token (52 builds)
R7 libcurl.pc: add `License` tag (7 builds)
R6 build: strip duplicate spaces after `Libs.private:` in `libcurl.pc` (10 builds)
R5 servers: add option to build without window handler (Windows) (2 builds)
R4 scorecard: report 'rss-max' (1 builds)
🔗 build: strip trailing spaces from `libcurl.pc`
R3 schannel: reuse the send buffer (5 builds)
R2 ldap: reject control characters in URL-decoded filter values (12 builds)
🔗 multi: use index list for expire timeouts
🔗 GHA/linux: replace raw C option with `CMAKE_BUILD_TYPE=Debug` in tsan job
🔗 appveyor: sync Debug options in two jobs
🔗 build: minor debug option message fixes/improvements
🔗 checksrc: check for `assert`, replace in tests where missing, drop from examples
🔗 build: require `!NDEBUG` for debug-enabled (aka development) builds
R1 DoH: improvements (22 builds)
R0 build: replace `assert()` with `DEBUGASSERT()`, where missing (6 builds)
43 data-points 100G-speed, b64dec, b64enc, connectdata, easy-handle, h1-req-cpu, h1-req-mem, h1-requests, h1parallel-cpu, h1parallel-mem, h1parallel-speed, h1parallel-upload-cpu, h1parallel-upload-mem, h1parallel-upload-speed, h1rate-cpu, h1rate-speed, h2-req-cpu, h2-req-mem, h2-requests, h2parallel-cpu, h2parallel-mem, h2parallel-speed, h2parallel-upload-cpu, h2parallel-upload-mem, h2parallel-upload-speed, h3-req-cpu, h3-req-mem, h3-requests, h3parallel-cpu, h3parallel-mem, h3parallel-speed, h3parallel-upload-cpu, h3parallel-upload-mem, h3parallel-upload-speed, maprintf, multi-handle, simplef, single-maxalloc, single-numallocs, snprintf, urldecode, urlencode, urlparser,
8 moving averages to watch
-5.71%connectdata struct size delta is larger than double std dev (1.88%)
27.00%HTTP/1 parallel requests delta is larger than double std dev (9.87%)
-1.04%CPU use for HTTP/2 parallel requests delta is larger than double std dev (0.44%)
10.45%HTTP/2 parallel requests delta is larger than double std dev (4.45%)
13.70%HTTP/3 parallel requests delta is larger than double std dev (4.46%)
-2.26%CPU use for parallel HTTP/3 delta is larger than double std dev (1.06%)
-15.58%CPU use for parallel upload HTTP/3 delta is larger than double std dev (7.30%)
-18.17%Curl_multi struct size delta is larger than double std dev (6.07%)

Download speed single transfer HTTP:// (100G-speed)

higher is better, bytes/sec
1524 samples, 189 rounds
P0:      4581217330 (4.58 G)
P25:     5406815817 (5.41 G)
P50:     5539358332 (5.54 G)
P75:     5636892451 (5.64 G)
P100:    6190875672 (6.19 G)
Mean:    5529771816 (5.53 G)
Moving:  5511727653 (5.51 G), -0.33% from mean
Std dev: 184974168 (184.97 M), 3.35% of mean
Span:    +-804829171 (804.83 M), 14.55% of mean

Marker:  2026-08-15 adjusted ('marker' is a set typical value for this test)
         5531140747 (5.53 G)
         1368930 (1.37 M) from mean, (0.02%) current results are worse
         -8217585 (8.22 M) from P50, (-0.15%) current results are BETTER
Most recent 100 rounds
Round 0 - 99 (of 189)
Description Downloads a single 100 gigabyte file over clear-text HTTP/1.1 from an Apache httpd server running on localhost with the curl tool. The measured network transfer speed in bytes per second is what the curl tool itself reports.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.0725)

Allocations for a single HTTP transfer (single-numallocs)

lower is better, allocs
1524 samples, 189 rounds
P0:      95
P25:     99
P50:     99
P75:     100
P100:    105
Mean:    99
Moving:  100, 1.02% from mean
Std dev: 2, 2.17% of mean
Span:    +-5, 5.03% of mean

Marker:  2026-08-18 smaller ('marker' is a set typical value for this test)
         99
         -0 from mean, (-0.39%) current results are worse
         0 from P50, (0.00%) 
Most recent 100 rounds
Round 0 - 99 (of 189)
Description Downloads a single 512M file over clear-text HTTP/1.1 from an Apache httpd server running on localhost. Using the built-in memory-tracking, all allocations done by curl and libcurl are logged and then counted.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0001)

Allocated memory for a single HTTP transfer (single-maxalloc)

lower is better, bytes
1524 samples, 189 rounds
P0:      127622
P25:     128070
P50:     128070
P75:     129910
P100:    132622
Mean:    129095
Moving:  127686, -1.09% from mean
Std dev: 1193, 0.92% of mean
Span:    +-2500, 1.94% of mean

Marker:  2026-09-03 optimizations ('marker' is a set typical value for this test)
         127974
         -1121 from mean, (-0.87%) current results are worse
         -96 from P50, (-0.07%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 189)
Description Downloads a single 512M file over clear-text HTTP/1.1 from an Apache httpd server running on localhost. Using the built-in memory-tracking, all allocations done by curl and libcurl are logged and then added up. This number is the peak number of bytes allocated concurrently at any point through the operation.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

Download speed parallel HTTP/1 (h1parallel-speed)

higher is better, bytes/sec
1519 samples, 189 rounds
P0:      2577915632 (2.58 G)
P25:     3533437305 (3.53 G)
P50:     3565455003 (3.57 G)
P75:     3584666383 (3.58 G)
P100:    3706836863 (3.71 G)
Mean:    3548542318 (3.55 G)
Moving:  3571340576 (3.57 G), 0.64% from mean
Std dev: 66779897 (66.78 M), 1.88% of mean
Span:    +-564460615 (564.46 M), 15.91% of mean

Marker:  2026-08-23 adjusted ('marker' is a set typical value for this test)
         3550345833 (3.55 G)
         1803514 (1.80 M) from mean, (0.05%) current results are worse
         -15109170 (15.11 M) from P50, (-0.42%) current results are BETTER
Most recent 100 rounds
Round 0 - 99 (of 189)
Description Downloads 100 files each in 100 parallel transfers, each getting a 500MB file. Using HTTP/1.1 over HTTPS from an Apache httpd running on localhost. This measures total throughput in bytes per second.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.3243)

Download speed parallel HTTP/2 (h2parallel-speed)

higher is better, bytes/sec
1521 samples, 189 rounds
P0:      2095945908 (2.10 G)
P25:     2521295770 (2.52 G)
P50:     2577271747 (2.58 G)
P75:     2610489778 (2.61 G)
P100:    2659707876 (2.66 G)
Mean:    2560834838 (2.56 G)
Moving:  2476478125 (2.48 G), -3.29% from mean
Std dev: 61121673 (61.12 M), 2.39% of mean
Span:    +-281880984 (281.88 M), 11.01% of mean

Marker:  2026-08-13 adjusted ('marker' is a set typical value for this test)
         2588820345 (2.59 G)
         27985506 (27.99 M) from mean, (1.09%) current results are worse
         11548597 (11.55 M) from P50, (0.45%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 189)
Description Downloads 100 files each in 100 parallel transfers, each getting a 500MB file. Using HTTP/2 over HTTPS from an Apache httpd running on localhost. This measures total throughput in bytes per second.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

Download speed parallel HTTP/3 (h3parallel-speed)

higher is better, bytes/sec
1523 samples, 189 rounds
P0:      881683489 (881.68 M)
P25:     1070999385 (1.07 G)
P50:     1093443120 (1.09 G)
P75:     1108309211 (1.11 G)
P100:    1171450837 (1.17 G)
Mean:    1087645327 (1.09 G)
Moving:  1073365164 (1.07 G), -1.31% from mean
Std dev: 30829042 (30.83 M), 2.83% of mean
Span:    +-144883673 (144.88 M), 13.32% of mean

Marker:  2026-08-11 initial ('marker' is a set typical value for this test)
         1098816436 (1.10 G)
         11171108 (11.17 M) from mean, (1.03%) current results are worse
         5373315 (5.37 M) from P50, (0.49%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 189)
Description Downloads 100 files each in 100 parallel transfers, each getting a 500MB file. Using HTTP/3 over HTTPS from a Caddy server running on localhost. This measures total throughput in bytes per second.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0001)

Memory use for parallel HTTP/1 (h1parallel-mem)

lower is better, bytes
1519 samples, 189 rounds
P0:      21409792 (21.41 M)
P25:     22224896 (22.22 M)
P50:     22401024 (22.40 M)
P75:     22523904 (22.52 M)
P100:    22962176 (22.96 M)
Mean:    22362352 (22.36 M)
Moving:  22208020 (22.21 M), -0.69% from mean
Std dev: 238658, 1.07% of mean
Span:    +-776192, 3.47% of mean

Marker:  2026-08-15 adjusted ('marker' is a set typical value for this test)
         22269952 (22.27 M)
         -92400 from mean, (-0.41%) current results are worse
         -131072 from P50, (-0.59%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 189)
Description Downloads 100 files each in 100 parallel transfers, each getting a 500MB file. Using HTTP/1.1 over HTTPS from an Apache httpd running on localhost. This measures the maximum RSS size in number of bytes used by the process during the transfer.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0008)

Memory use for parallel HTTP/2 (h2parallel-mem)

lower is better, bytes
1521 samples, 189 rounds
P0:      13848576 (13.85 M)
P25:     14462976 (14.46 M)
P50:     14610432 (14.61 M)
P75:     14716928 (14.72 M)
P100:    15085568 (15.09 M)
Mean:    14577587 (14.58 M)
Moving:  14404730 (14.40 M), -1.19% from mean
Std dev: 191336, 1.31% of mean
Span:    +-618496, 4.24% of mean

Marker:  2026-08-14 adjusted ('marker' is a set typical value for this test)
         14516224 (14.52 M)
         -61363 from mean, (-0.42%) current results are worse
         -94208 from P50, (-0.64%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 189)
Description Downloads 100 files each in 100 parallel transfers, each getting a 500MB file. Using HTTP/2 over HTTPS from an Apache httpd running on localhost. This measures the maximum RSS size in number of bytes used by the process during the transfer.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.2335)

Memory use for parallel HTTP/3 (h3parallel-mem)

lower is better, bytes
1523 samples, 189 rounds
P0:      15239914 (15.24 M)
P25:     15941632 (15.94 M)
P50:     16072704 (16.07 M)
P75:     16203776 (16.20 M)
P100:    17469440 (17.47 M)
Mean:    16074488 (16.07 M)
Moving:  15948513 (15.95 M), -0.78% from mean
Std dev: 237104, 1.48% of mean
Span:    +-1114762 (1.11 M), 6.93% of mean

Marker:  2026-08-15 initial ('marker' is a set typical value for this test)
         16025600 (16.03 M)
         -48888 from mean, (-0.30%) current results are worse
         -47104 from P50, (-0.29%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 189)
Description Downloads 100 files each in 100 parallel transfers, each getting a 500MB file. Using HTTP/3 over HTTPS from a Caddy server running on localhost. This measures the maximum RSS size in number of bytes used by the process during the transfer.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.2198)

CPU use for parallel HTTP/1 (h1parallel-cpu)

higher is better, CPU%
1519 samples, 189 rounds
P0:      97.263
P25:     100.125
P50:     100.211
P75:     100.292
P100:    100.536
Mean:    100.195
Moving:  100.200, 0.00% from mean
Std dev: 0.200, 0.20% of mean
Span:    +-1.637, 1.63% of mean
Most recent 100 rounds
Round 0 - 99 (of 189)
Description
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.7727)

CPU use for parallel HTTP/2 (h2parallel-cpu)

higher is better, CPU%
1521 samples, 189 rounds
P0:      92.475
P25:     99.660
P50:     99.735
P75:     99.791
P100:    99.982
Mean:    99.650
Moving:  99.118, -0.53% from mean
Std dev: 0.377, 0.38% of mean
Span:    +-3.753, 3.77% of mean
Most recent 100 rounds
Round 0 - 99 (of 189)
Description
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

CPU use for parallel HTTP/3 (h3parallel-cpu)

higher is better, CPU%
1523 samples, 189 rounds
P0:      86.317
P25:     92.620
P50:     93.085
P75:     93.402
P100:    97.391
Mean:    92.996
Moving:  90.894, -2.26% from mean
Std dev: 0.988, 1.06% of mean
Span:    +-5.537, 5.95% of mean
Most recent 100 rounds
Round 0 - 99 (of 189)
Description
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

Upload speed parallel HTTP/1 (h1parallel-upload-speed)

higher is better, bytes/sec
1506 samples, 188 rounds
P0:      1964322029 (1.96 G)
P25:     2464288850 (2.46 G)
P50:     2475677610 (2.48 G)
P75:     2482092474 (2.48 G)
P100:    2548998358 (2.55 G)
Mean:    2470757813 (2.47 G)
Moving:  2490670530 (2.49 G), 0.81% from mean
Std dev: 28666648 (28.67 M), 1.16% of mean
Span:    +-292338164 (292.34 M), 11.83% of mean

Marker:  2026-08-15 adjust ('marker' is a set typical value for this test)
         2476120686 (2.48 G)
         5362872 (5.36 M) from mean, (0.22%) current results are worse
         443075 from P50, (0.02%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 188)
Description Uploads 100 files each in 50 parallel transfers, each uploading a 500MB file. Using HTTP/1.1 over HTTPS to an Apache httpd running on localhost. This measures the total throughput in number of bytes per second.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.0594)

Upload speed parallel HTTP/2 (h2parallel-upload-speed)

higher is better, bytes/sec
1506 samples, 188 rounds
P0:      70272149 (70.27 M)
P25:     1620965051 (1.62 G)
P50:     1645294607 (1.65 G)
P75:     1665723804 (1.67 G)
P100:    1747663018 (1.75 G)
Mean:    1635949664 (1.64 G)
Moving:  1655358396 (1.66 G), 1.19% from mean
Std dev: 83158159 (83.16 M), 5.08% of mean
Span:    +-838695434 (838.70 M), 51.27% of mean

Marker:  2026-08-23 ajusted ('marker' is a set typical value for this test)
         1634397715 (1.63 G)
         -1551949 (1.55 M) from mean, (-0.09%) current results are BETTER
         -10896892 (10.90 M) from P50, (-0.66%) current results are BETTER
Most recent 100 rounds
Round 0 - 99 (of 188)
Description Uploads 100 files each in 50 parallel transfers, each uploading a 500MB file. Using HTTP/2 over HTTPS to an Apache httpd running on localhost. This measures the total throughput in number of bytes per second.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.4656)

Upload speed parallel HTTP/3 (h3parallel-upload-speed)

higher is better, bytes/sec
1497 samples, 188 rounds
P0:      268008334 (268.01 M)
P25:     296546755 (296.55 M)
P50:     337786652 (337.79 M)
P75:     623633881 (623.63 M)
P100:    762398300 (762.40 M)
Mean:    410400861 (410.40 M)
Moving:  627731761 (627.73 M), 52.96% from mean
Std dev: 147401490 (147.40 M), 35.92% of mean
Span:    +-247194983 (247.19 M), 60.23% of mean

Marker:  2026-08-27 improved ('marker' is a set typical value for this test)
         638021337 (638.02 M)
         227620475 (227.62 M) from mean, (55.46%) current results are worse
         300234684 (300.23 M) from P50, (88.88%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 188)
Description Uploads 100 files each in 50 parallel transfers, each uploading a 500MB file. Using HTTP/3 over HTTPS to an Apache httpd (via a httpx proxy) running on localhost. This measures the total throughput in number of bytes per second.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

Memory use for parallel upload HTTP/1 (h1parallel-upload-mem)

lower is better, bytes
1506 samples, 188 rounds
P0:      22200320 (22.20 M)
P25:     22962176 (22.96 M)
P50:     23076864 (23.08 M)
P75:     23171072 (23.17 M)
P100:    25808896 (25.81 M)
Mean:    23065005 (23.07 M)
Moving:  22903767 (22.90 M), -0.70% from mean
Std dev: 222403, 0.96% of mean
Span:    +-1804288 (1.80 M), 7.82% of mean

Marker:  2026-08-17 adjusted ('marker' is a set typical value for this test)
         23076864 (23.08 M)
         11858 from mean, (0.05%) current results are BETTER
         0 from P50, (0.00%) 
Most recent 100 rounds
Round 0 - 99 (of 188)
Description Uploads 100 files each in 50 parallel transfers, each uploading a 500MB file. Using HTTP/1.1 over HTTPS to an Apache httpd running on localhost. This measures the maximum RSS size in number of bytes used by the process during the transfer.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.6701)

Memory use for parallel upload HTTP/2 (h2parallel-upload-mem)

lower is better, bytes
1506 samples, 188 rounds
P0:      20467712 (20.47 M)
P25:     21041152 (21.04 M)
P50:     21159936 (21.16 M)
P75:     21254144 (21.25 M)
P100:    21622784 (21.62 M)
Mean:    21142221 (21.14 M)
Moving:  21051146 (21.05 M), -0.43% from mean
Std dev: 162554, 0.77% of mean
Span:    +-577536, 2.73% of mean

Marker:  2026-08-11 initial ('marker' is a set typical value for this test)
         21196967 (21.20 M)
         54745 from mean, (0.26%) current results are BETTER
         37031 from P50, (0.18%) current results are BETTER
Most recent 100 rounds
Round 0 - 99 (of 188)
Description Uploads 100 files each in 50 parallel transfers, each uploading a 500MB file. Using HTTP/2 over HTTPS to an Apache httpd running on localhost. This measures the maximum RSS size in number of bytes used by the process during the transfer.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.9454)

Memory use for parallel upload HTTP/3 (h3parallel-upload-mem)

lower is better, bytes
1497 samples, 188 rounds
P0:      27279360 (27.28 M)
P25:     52445184 (52.45 M)
P50:     543145984 (543.15 M)
P75:     543301632 (543.30 M)
P100:    543703040 (543.70 M)
Mean:    398076492 (398.08 M)
Moving:  50701844 (50.70 M), -87.26% from mean
Std dev: 224542798 (224.54 M), 56.41% of mean
Span:    +-258211840 (258.21 M), 64.86% of mean

Marker:  2026-08-27 improved ('marker' is a set typical value for this test)
         40370995 (40.37 M)
         -357705497 (357.71 M) from mean, (-89.86%) current results are worse
         -502774989 (502.77 M) from P50, (-92.57%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 188)
Description Uploads 100 files each in 50 parallel transfers, each uploading a 500MB file. Using HTTP/3 over HTTPS to an Apache httpd (via a httpx proxy) running on localhost. This measures the maximum RSS size in number of bytes used by the process during the transfer.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

CPU use for parallel upload HTTP/1 (h1parallel-upload-cpu)

higher is better, CPU%
1506 samples, 188 rounds
P0:      95.789
P25:     99.964
P50:     100.013
P75:     100.060
P100:    100.211
Mean:    100.005
Moving:  99.985, -0.02% from mean
Std dev: 0.150, 0.15% of mean
Span:    +-2.211, 2.21% of mean
Most recent 100 rounds
Round 0 - 99 (of 188)
Description
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.2371)

CPU use for parallel upload HTTP/2 (h2parallel-upload-cpu)

higher is better, CPU%
1506 samples, 188 rounds
P0:      4.179
P25:     95.384
P50:     95.856
P75:     96.226
P100:    97.435
Mean:    95.320
Moving:  93.644, -1.76% from mean
Std dev: 4.535, 4.76% of mean
Span:    +-46.628, 48.92% of mean
Most recent 100 rounds
Round 0 - 99 (of 188)
Description
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

CPU use for parallel upload HTTP/3 (h3parallel-upload-cpu)

higher is better, CPU%
1497 samples, 188 rounds
P0:      66.576
P25:     87.054
P50:     99.746
P75:     99.787
P100:    99.995
Mean:    95.423
Moving:  80.559, -15.58% from mean
Std dev: 6.969, 7.30% of mean
Span:    +-16.709, 17.51% of mean
Most recent 100 rounds
Round 0 - 99 (of 188)
Description
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

HTTP/1 parallel requests (h1-requests)

higher is better, requests/sec
1483 samples, 186 rounds
P0:      22998
P25:     30679
P50:     31582
P75:     32273
P100:    55818
Mean:    31585
Moving:  40114, 27.00% from mean
Std dev: 3117, 9.87% of mean
Span:    +-16410, 51.95% of mean

Marker:  2026-08-11 early ('marker' is a set typical value for this test)
         31096
         -489 from mean, (-1.55%) current results are BETTER
         -486 from P50, (-1.54%) current results are BETTER
Most recent 100 rounds
Round 0 - 99 (of 186)
Description Downloads 100,000 small files (10K) using 40 parallel transfers over HTTP/1.1 HTTPS from an Apache httpd running on localhost. Measures how many such requests per second it manages to perform.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

HTTP/2 parallel requests (h2-requests)

higher is better, requests/sec
1483 samples, 186 rounds
P0:      28121
P25:     30361
P50:     30610
P75:     30842
P100:    44318
Mean:    30721
Moving:  33932, 10.45% from mean
Std dev: 1367, 4.45% of mean
Span:    +-8098, 26.36% of mean

Marker:  2026-08-15 adjust ('marker' is a set typical value for this test)
         30718
         -3 from mean, (-0.01%) current results are BETTER
         107 from P50, (0.35%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 186)
Description Downloads 100,000 small files (10K) using 40 parallel transfers over HTTP/2 HTTPS from an Apache httpd running on localhost. Measures how many such requests per second it manages to perform.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.1111)

HTTP/3 parallel requests (h3-requests)

higher is better, requests/sec
1483 samples, 186 rounds
P0:      20416
P25:     28815
P50:     29100
P75:     29487
P100:    39807
Mean:    29401
Moving:  33429, 13.70% from mean
Std dev: 1310, 4.46% of mean
Span:    +-9695, 32.98% of mean

Marker:  2026-08-11 early ('marker' is a set typical value for this test)
         28920
         -481 from mean, (-1.64%) current results are BETTER
         -180 from P50, (-0.62%) current results are BETTER
Most recent 100 rounds
Round 0 - 99 (of 186)
Description Downloads 100,000 small files (10K) using 40 parallel transfers over HTTP/3 HTTPS from a Caddy server running on localhost. Measures how many such requests per second it manages to perform.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

Memory use for HTTP/1 parallel requests (h1-req-mem)

lower is better, bytes
1483 samples, 186 rounds
P0:      17698816 (17.70 M)
P25:     18161664 (18.16 M)
P50:     18337792 (18.34 M)
P75:     18841600 (18.84 M)
P100:    20090880 (20.09 M)
Mean:    18611347 (18.61 M)
Moving:  19636879 (19.64 M), 5.51% from mean
Std dev: 641178, 3.45% of mean
Span:    +-1196032 (1.20 M), 6.43% of mean

Marker:  2026-09-03 adjust ('marker' is a set typical value for this test)
         19825459 (19.83 M)
         1214111 (1.21 M) from mean, (6.52%) current results are BETTER
         1487667 (1.49 M) from P50, (8.11%) current results are BETTER
Most recent 100 rounds
Round 0 - 99 (of 186)
Description Downloads 100,000 small files (10K) using 40 parallel transfers over HTTP/1.1 HTTPS from an Apache httpd running on localhost. Measures the maximum RSS size in number of bytes used by the process during the transfer.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

Memory use for HTTP/2 parallel requests (h2-req-mem)

lower is better, bytes
1483 samples, 186 rounds
P0:      12587008 (12.59 M)
P25:     13258752 (13.26 M)
P50:     13352960 (13.35 M)
P75:     13438976 (13.44 M)
P100:    13905920 (13.91 M)
Mean:    13338798 (13.34 M)
Moving:  13234913 (13.23 M), -0.78% from mean
Std dev: 151668, 1.14% of mean
Span:    +-659456, 4.94% of mean

Marker:  2026-08-13 after rss-max ('marker' is a set typical value for this test)
         13330887 (13.33 M)
         -7911 from mean, (-0.06%) current results are worse
         -22073 from P50, (-0.17%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 186)
Description Downloads 100,000 small files (10K) using 40 parallel transfers over HTTP/2 HTTPS from an Apache httpd running on localhost. Measures the maximum RSS size in number of bytes used by the process during the transfer.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0373)

Memory use for HTTP/3 parallel requests (h3-req-mem)

lower is better, bytes
1483 samples, 186 rounds
P0:      13135872 (13.14 M)
P25:     13766656 (13.77 M)
P50:     13856768 (13.86 M)
P75:     13942784 (13.94 M)
P100:    14430208 (14.43 M)
Mean:    13843843 (13.84 M)
Moving:  13731594 (13.73 M), -0.81% from mean
Std dev: 140649, 1.02% of mean
Span:    +-647168, 4.67% of mean

Marker:  2026-08-13 after rss-max ('marker' is a set typical value for this test)
         13864330 (13.86 M)
         20486 from mean, (0.15%) current results are BETTER
         7562 from P50, (0.05%) current results are BETTER
Most recent 100 rounds
Round 0 - 99 (of 186)
Description Downloads 100,000 small files (10K) using 40 parallel transfers over HTTP/3 HTTPS from a Caddy server running on localhost. Measures the maximum RSS size in number of bytes used by the process during the transfer.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.3420)

CPU use for HTTP/1 parallel requests (h1-req-cpu)

higher is better, CPU%
1483 samples, 186 rounds
P0:      99.116
P25:     99.799
P50:     99.997
P75:     100.191
P100:    100.753
Mean:    99.999
Moving:  100.047, 0.05% from mean
Std dev: 0.274, 0.27% of mean
Span:    +-0.819, 0.82% of mean
Most recent 100 rounds
Round 0 - 99 (of 186)
Description
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.9264)

CPU use for HTTP/2 parallel requests (h2-req-cpu)

higher is better, CPU%
1483 samples, 186 rounds
P0:      96.064
P25:     99.878
P50:     100.078
P75:     100.279
P100:    100.802
Mean:    100.042
Moving:  99.006, -1.04% from mean
Std dev: 0.442, 0.44% of mean
Span:    +-2.369, 2.37% of mean
Most recent 100 rounds
Round 0 - 99 (of 186)
Description
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0001)

CPU use for HTTP/3 parallel requests (h3-req-cpu)

higher is better, CPU%
1483 samples, 186 rounds
P0:      89.120
P25:     99.699
P50:     99.919
P75:     100.127
P100:    100.761
Mean:    99.883
Moving:  99.257, -0.63% from mean
Std dev: 0.479, 0.48% of mean
Span:    +-5.820, 5.83% of mean
Most recent 100 rounds
Round 0 - 99 (of 186)
Description
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.3156)

Curl_easy struct size (easy-handle)

lower is better, bytes
1377 samples, 167 rounds
P0:      3368
P25:     3424
P50:     3424
P75:     4024
P100:    4256
Mean:    3701
Moving:  3376, -8.77% from mean
Std dev: 324, 8.76% of mean
Span:    +-444, 11.99% of mean

Marker:  2026-08-22 strings redone ('marker' is a set typical value for this test)
         3424
         -277 from mean, (-7.50%) current results are worse
         0 from P50, (0.00%) 
Most recent 100 rounds
Round 0 - 99 (of 167)
Description Uses the 'pahole' tool to extract the object size of the Curl_easy struct (counted in number of bytes) from the build. One of these structs is allocated as a handle for each libcurl transfer. The exact size of this struct depends on architecture and build options.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

Curl_multi struct size (multi-handle)

lower is better, bytes
1377 samples, 167 rounds
P0:      656
P25:     872
P50:     872
P75:     872
P100:    920
Mean:    861
Moving:  704, -18.17% from mean
Std dev: 52, 6.07% of mean
Span:    +-132, 15.33% of mean

Marker:  2026-09-05 work ('marker' is a set typical value for this test)
         672
         -189 from mean, (-21.96%) current results are worse
         -200 from P50, (-22.94%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 167)
Description Uses the 'pahole' tool to extract the object size of the Curl_multi struct (counted in number of bytes) from the build. One of these structs is allocated for each multi handle, and it may hold multiple concurrent transfers. The exact size of this struct depends on architecture and build options.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

connectdata struct size (connectdata)

lower is better, bytes
1377 samples, 167 rounds
P0:      760
P25:     816
P50:     816
P75:     824
P100:    824
Mean:    813
Moving:  767, -5.71% from mean
Std dev: 15, 1.88% of mean
Span:    +-32, 3.93% of mean

Marker:  2026-09-05 shrink ('marker' is a set typical value for this test)
         760
         -53 from mean, (-6.61%) current results are worse
         -56 from P50, (-6.86%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 167)
Description Uses the 'pahole' tool to extract the object size of the connectdata struct (counted in number of bytes) from the build. One of these structs is allocated for every concurrent connection libcurl holds. The exact size of this struct depends on architecture and build options.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

Limit-rate CPU use (h1rate-cpu)

lower is better, CPU%
1038 samples, 144 rounds
P0:      2.535
P25:     2.682
P50:     2.725
P75:     2.777
P100:    3.789
Mean:    2.736
Moving:  2.726, -0.37% from mean
Std dev: 0.090, 3.29% of mean
Span:    +-0.627, 22.91% of mean

Marker:  2026-08-17 after 25 runs ('marker' is a set typical value for this test)
         2.721
         -0.015 from mean, (-0.55%) current results are worse
         -0.004 from P50, (-0.15%) current results are worse
Most recent 100 rounds
Round 0 - 99 (of 144)
Description Downloads 20 files in 20 parallel transfers over HTTPS using HTTP/1, each file is 100MB. The transfers are limited to download at 5000KB/sec. This measures the CPU% used for the transfer and it should be as low as possible.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0490)

Limit-rate network speed (h1rate-speed)

exact is better, bytes/sec
1038 samples, 144 rounds
P0:      5119499 (5.12 M)
P25:     5121291 (5.12 M)
P50:     5121799 (5.12 M)
P75:     5121973 (5.12 M)
P100:    5122356 (5.12 M)
Mean:    5121538 (5.12 M)
Moving:  5121810 (5.12 M), 0.01% from mean
Std dev: 625, 0.01% of mean
Span:    +-1428, 0.03% of mean

Marker:  2026-08-17 exact ('marker' is a set typical value for this test)
         5120000 (5.12 M)
         -1538 from mean, (-0.03%) 
         -1799 from P50, (-0.04%) 
Most recent 100 rounds
Round 0 - 99 (of 144)
Description Downloads 20 files in 20 parallel transfers over HTTPS using HTTP/1, each file is 100MB. The transfers are limited to download at 5000KB/sec. The result should be as exact to 5000KB/sec as possible. 5120000 bytes/second.
Data distribution

Full range

Downsamples the entire set to 100 data points.

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0224)

base64 encoding (b64enc)

lower is better, nanoseconds
137 samples, 34 rounds
P0:      94.33
P25:     206.91
P50:     208.32
P75:     209.90
P100:    218.80
Mean:    194.95
Moving:  177.60, -8.90% from mean
Std dev: 37.60, 19.29% of mean
Span:    +-62.24, 31.92% of mean

Marker:  2026-09-03 initial ('marker' is a set typical value for this test)
         208.00
         13.05 from mean, (6.69%) current results are BETTER
         -0.32 from P50, (-0.15%) current results are worse
Most recent 34 rounds
Description This base64 encodes a 256-byte buffer holding the octet corresponding to its index, 10 million times. The result is the average time in nanoseconds the encode function takes.
Data distribution

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0006)

base64 decoding (b64dec)

lower is better, nanoseconds
137 samples, 34 rounds
P0:      129.42
P25:     348.20
P50:     352.81
P75:     357.44
P100:    377.28
Mean:    326.44
Moving:  293.11, -10.21% from mean
Std dev: 74.26, 22.75% of mean
Span:    +-123.93, 37.96% of mean

Marker:  2026-09-05 adjusted ('marker' is a set typical value for this test)
         352.00
         25.56 from mean, (7.83%) current results are BETTER
         -0.81 from P50, (-0.23%) current results are worse
Most recent 34 rounds
Description This test base64 decodes a buffer into a 256-byte buffer holding the octet corresponding to its index. 10 million times. The result is the average time in nanoseconds the decode function takes.
Data distribution

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically insignificant (P: 0.8356)

snprintf (snprintf)

lower is better, nanoseconds
184 samples, 48 rounds
P0:      202.41
P25:     424.30
P50:     431.13
P75:     453.18
P100:    489.35
Mean:    416.41
Moving:  365.71, -12.17% from mean
Std dev: 68.71, 16.50% of mean
Span:    +-143.47, 34.45% of mean

Marker:  2026-09-05 optimized ('marker' is a set typical value for this test)
         426.00
         9.59 from mean, (2.30%) current results are BETTER
         -5.13 from P50, (-1.19%) current results are worse
Most recent 48 rounds
Description Invokes a decently complicated curl_msnprintf() call ten million times and evaluates the average time in nanoseconds the call took.
Data distribution

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

maprintf (maprintf)

lower is better, nanoseconds
40 samples, 12 rounds
P0:      103.39
P25:     105.97
P50:     286.25
P75:     295.19
P100:    299.86
Mean:    213.52
Moving:  184.32, -13.67% from mean
Std dev: 93.79, 43.93% of mean
Span:    +-98.24, 46.01% of mean

Marker:  2026-09-07 init ('marker' is a set typical value for this test)
         292.00
         78.48 from mean, (36.75%) current results are BETTER
         5.75 from P50, (2.01%) current results are BETTER
Most recent 12 rounds
Description This test repeatedly formats a request header block with `curl_maprintf()`, which allocates the result, and measures the time per call. It exercises the allocating output path and a `curl_off_t` conversion.
Data distribution

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0164)

simple printf (simplef)

lower is better, nanoseconds
40 samples, 12 rounds
P0:      78.80
P25:     82.52
P50:     207.81
P75:     211.49
P100:    215.65
Mean:    156.14
Moving:  135.45, -13.25% from mean
Std dev: 64.74, 41.46% of mean
Span:    +-68.43, 43.82% of mean

Marker:  2026-09-07 init ('marker' is a set typical value for this test)
         212.00
         55.86 from mean, (35.77%) current results are BETTER
         4.19 from P50, (2.01%) current results are BETTER
Most recent 12 rounds
Description This test repeatedly formats a commonly used simple message with `curl_msnprintf()`: literal text plus `%s`, a `size_t` and a `curl_off_t`, with no width or precision. Where `snprintf` measures an elaborate format, this measures the common one.
Data distribution

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0075)

URL parsing (urlparser)

lower is better, nanoseconds
184 samples, 48 rounds
P0:      163.54
P25:     349.84
P50:     353.04
P75:     362.53
P100:    405.80
Mean:    338.75
Moving:  300.93, -11.16% from mean
Std dev: 56.18, 16.58% of mean
Span:    +-121.13, 35.76% of mean

Marker:  2026-09-01 initial ('marker' is a set typical value for this test)
         360.00
         21.25 from mean, (6.27%) current results are BETTER
         6.96 from P50, (1.97%) current results are BETTER
Most recent 48 rounds
Description This test has a list of 500+ different URLs. It parses each URL seven times using different URL parser options. It then repeats it all 2500 times, for a total of 10,097,500 URL parser invocations. The result is the average time in nanoseconds the URL parsing function took across all invocations.
Data distribution

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

URL encode (urlencode)

lower is better, nanoseconds
136 samples, 33 rounds
P0:      132.62
P25:     380.39
P50:     384.17
P75:     389.74
P100:    2131.33
Mean:    492.29
Moving:  315.87, -35.84% from mean
Std dev: 484.73, 98.47% of mean
Span:    +-999.36, 203.00% of mean

Marker:  2026-09-04 optimized ('marker' is a set typical value for this test)
         389.00
         -103.29 from mean, (-20.98%) current results are worse
         4.83 from P50, (1.26%) current results are BETTER
Most recent 33 rounds
Description URL encodes a 256-byte buffer holding the octet corresponding to its index. 2.5 million times. The result is the average time in nanoseconds the encode function takes.
Data distribution

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0000)

URL decode (urldecode)

lower is better, nanoseconds
136 samples, 33 rounds
P0:      168.20
P25:     339.33
P50:     341.60
P75:     345.46
P100:    602.36
Mean:    340.69
Moving:  295.40, -13.29% from mean
Std dev: 92.23, 27.07% of mean
Span:    +-217.08, 63.72% of mean

Marker:  2026-09-04 optimized ('marker' is a set typical value for this test)
         342.00
         1.31 from mean, (0.38%) current results are BETTER
         0.40 from P50, (0.12%) current results are BETTER
Most recent 33 rounds
Description URL descode an encoded string that decodes into a 256-byte buffer holding the octet corresponding to its index. 2.5 million times. The result is the average time in nanoseconds the decode function takes.
Data distribution

Trend

Draws a trend-line for the full range set. The trend is only considered statistically significant if the P value is less than 0.05. Mann-Kendall says: statistically SIGNIFICANT (P: 0.0067)

configure

--enable-unity --disable-shared --enable-ipv6 --with-gssapi --enable-werror --with-nghttp2 --with-openssl --with-ngtcp2 --with-nghttp3 --with-libssh2 --with-test-caddy=/home/dast/caddy/caddy_linux_amd64 --enable-ssls-export --enable-httpsrr --with-test-nghttpx=/home/dast/build-nghttp2/bin/nghttpx --with-backtrace --enable-ntlm --enable-smb --enable-proxy-http3 --enable-httpsig

curl -V

curl 8.22.1-DEV (x86_64-pc-linux-gnu) libcurl/8.22.1-DEV OpenSSL/3.6.4 zlib/1.3.2 brotli/1.2.0 zstd/1.5.7 libidn2/2.3.8 libpsl/0.23.3 libssh2/1.11.1 nghttp2/1.70.0 ngtcp2/1.24.0 nghttp3/1.17.0 mit-krb5/1.22.1 OpenLDAP/2.6.14
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt mqtts pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTP3 HTTPS-proxy HTTPSIG HTTPSRR IDN IPv6 Kerberos Largefile libz NTLM proxy-HTTP3 PSL SPNEGO SSL SSLS-EXPORT threadsafe UnixSockets zstd