Skip to content

Instantly share code, notes, and snippets.

@bagder
Last active September 6, 2022 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bagder/dac962c022171a212c54221afc4b99d2 to your computer and use it in GitHub Desktop.
Save bagder/dac962c022171a212c54221afc4b99d2 to your computer and use it in GitHub Desktop.
speedparse -- bechmark the the libcurl URL parser
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at https://curl.se/docs/copyright.html.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
* SPDX-License-Identifier: curl
*
***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
static const char *list[] = {
"https://user:password@example.net/get?this=and#but frag then",
"https://user:password@example.net/get?this=and what",
"https://user:password@example.net/ge t?this=and-what",
"https://user:pass word@example.net/get?this=and-what",
"https://u ser:password@example.net/get?this=and-what",
"imap://user:pass;opt ion@server/path",
"htt ps://user:password@example.net/get?this=and-what",
"https://user:password@example.net/get?this=and what",
"https://user:password@example.net/ge t?this=and-what",
"https://user:pass word@example.net/get?this=and-what",
"https://u ser:password@example.net/get?this=and-what",
"https://user:password@example.net/ge t?this=and-what",
"[0:0:0:0:0:0:0:1]",
"[::1]",
"[::]",
"https://[::1]",
"user:moo@ftp.example.com/color/#green?no-red",
"ftp.user:moo@example.com/color/#green?no-red",
"file:/C:\\programs\\foo",
"file://C:\\programs\\foo",
"file:///C:\\programs\\foo",
"file://host.example.com/Share/path/to/file.txt",
"https://example.com/color/#green?no-red",
"https://example.com/color/#green#no-red",
"https://example.com/color/?green#no-red",
"https://example.com/#color/?green#no-red",
"https://example.#com/color/?green#no-red",
"http://[ab.be:1]/x", "",
"http://[ab.be]/x", "",
"http://a:b@/x", "",
"boing:80",
"http://[fd00:a41::50]:8080",
"http://[fd00:a41::50]/",
"http://[fd00:a41::50]",
"https://[::1%252]:1234",
"https://[fe80::20c:29ff:fe9c:409b%eth0]:1234",
"https://127.0.0.1:443",
"http://%3a:%3a@ex4mple/%3f+?+%3f+%23#+%23%3f%g7",
"http://%3a:%3a@ex4mple/%3f?%3f%35#%35%3f%g7",
"http://HO0_-st%41/",
"file://hello.html",
"http://HO0_-st/",
"imap://user:pass;option@server/path",
"http://user:pass;option@server/path",
"file:/hello.html",
"file:/h",
"file:/",
"file://127.0.0.1/hello.html",
"file:////hello.html",
"file:///hello.html",
"https://127.0.0.1",
"https://127.0.0.1",
"https://[::1]:1234",
"https://127abc.com",
"https:// example.com?check", "",
"https://e x a m p l e.com?check", "",
"https://example.com?check",
"https://example.com:65536",
"https://example.com:-1#moo",
"https://example.com:0#moo",
"https://example.com:01#moo",
"https://example.com:1#moo",
"http://example.com#moo",
"http://example.com",
"http://example.com/path/html",
"http://example.com/path/html?query=name",
"http://example.com/path/html?query=name#anchor",
"http://example.com:1234/path/html?query=name#anchor",
"http:///user:password@example.com:1234/path/html?query=name#anchor",
"https://user:password@example.com:1234/path/html?query=name#anchor",
"http://user:password@example.com:1234/path/html?query=name#anchor",
"http:/user:password@example.com:1234/path/html?query=name#anchor",
"http:////user:password@example.com:1234/path/html?query=name#anchor",
"http://example.com%40127.0.0.1/",
"http://example.com%21127.0.0.1/",
"http://example.com%3f127.0.0.1/",
"http://example.com%23127.0.0.1/",
"http://example.com%3a127.0.0.1/",
"http://example.com%09127.0.0.1/",
"http://example.com%2F127.0.0.1/",
"https://%this",
"https://h%c",
"https://%%%%%%",
"https://%41",
"https://%20",
"https://%41%0d",
"https://%25",
"https://_%c0_",
"https://_%c0_",
"https://16843009",
"https://0x7f.1",
"https://0177.1",
"https://0111.02.0x3",
"https://0xff.0xff.0377.255",
"https://1.0xffffff",
"https://+127.0.0.1",
"https://+127.0.0.1",
"https://127.-0.0.1",
"https://127.0. 1",
"https://1.0x1000000",
"https://1.2.3.256",
"https://1.2.3.4.5",
"https://1.2.0x100.3",
"https://4294967296",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA://hostname/path",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA://hostname/path",
"https://[fe80::20c:29ff:fe9c:409b%]:1234",
"https://[fe80::20c:29ff:fe9c:409b%25]:1234",
"https://[fe80::20c:29ff:fe9c:409b%eth0]:1234",
"https://[::%25fakeit]/moo",
"smtp.example.com/path/html",
"https.example.com/path/html",
"dict.example.com/path/html",
"pop3.example.com/path/html",
"ldap.example.com/path/html",
"imap.example.com/path/html",
"ftp.example.com/path/html",
"example.com/path/html",
"HTTP://test/",
"http://HO0_-st..~./",
"http:/@example.com: 123/",
"http:/@example.com:123 /",
"http:/@example.com:123a/",
"http://host/file\r",
"http://host/file\n\x03",
"htt\x02://host/file",
" http://host/file",
"imap://user:pass;word@host/file",
"http://user:pass;word@host/file",
"file:///file.txt#moo",
"file:////file.txt",
"file:///file.txt",
"file:./",
"http://example.com/hello/../here",
"http://example.com/hello/../here",
"http://example.com:80",
"tp://example.com/path/html",
"http://hello:fool@example.com",
"http:/@example.com:123",
"http:/:password@example.com",
"http://user@example.com?#",
"http://user@example.com?",
"http://user@example.com#anchor",
"example.com/path/html",
"example.com/path/html",
"http://user:password@example.com:1234/path/html?query=name#anchor",
"http://example.com:1234/path/html?query=name#anchor",
"http://example.com/path/html?query=name#anchor",
"http://example.com/path/html?query=name",
"http://example.com/path/html",
"tp://example.com/path/html",
"custom-scheme://host?expected=test-good",
"custom-scheme://?expected=test-bad",
"custom-scheme://?expected=test-new-good",
"custom-scheme://host?expected=test-still-good",
"https://www.microsoft.com",
"https://opensource.org",
"https://www.google.com",
"https://www.yahoo.com",
"https://www.ibm.com",
"https://www.mysql.com",
"https://www.oracle.com",
"https://www.ripe.net",
"https://www.iana.org",
"https://www.amazon.com",
"https://www.netcraft.com",
"https://www.heise.de",
"https://www.chip.de",
"https://www.ca.com",
"https://www.cnet.com",
"https://www.mozilla.org",
"https://www.cnn.com",
"https://www.wikipedia.org",
"https://www.dell.com",
"https://www.hp.com",
"https://www.cert.org",
"https://www.mit.edu",
"https://www.nist.gov",
"https://www.ebay.com",
"https://www.playstation.com",
"https://www.uefa.com",
"https://www.ieee.org",
"https://www.apple.com",
"https://www.symantec.com",
"https://www.zdnet.com",
"https://www.fujitsu.com/global/",
"https://www.supermicro.com",
"https://www.hotmail.com",
"https://www.ietf.org",
"https://www.bbc.co.uk",
"https://news.google.com",
"https://www.foxnews.com",
"https://www.msn.com",
"https://www.wired.com",
"https://www.sky.com",
"https://www.usatoday.com",
"https://www.cbs.com",
"https://www.nbc.com/",
"https://slashdot.org",
"https://www.informationweek.com",
"https://apache.org",
"https://www.un.org",
"https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc?ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
NULL
};
#define END_OF_LIST 0xffffff
const static int options[] = {
CURLU_DEFAULT_PORT,
CURLU_NO_DEFAULT_PORT,
CURLU_DEFAULT_SCHEME,
CURLU_NON_SUPPORT_SCHEME,
CURLU_ALLOW_SPACE,
CURLU_GUESS_SCHEME,
CURLU_PATH_AS_IS,
CURLU_DISALLOW_USER,
END_OF_LIST
};
int main(int argc, char **argv)
{
int l, o, u;
int count = 0;
struct timeval start;
struct timeval end;
time_t diff;
long us;
int laps = 100;
if(argc > 1)
laps = atoi(argv[1]);
gettimeofday(&start, NULL);
//curl_dbg_memdebug("dump");
for(l = 0; l < laps; l++) {
for(o = 0; options[o] != END_OF_LIST; o++) {
for(u = 0; list[u]; u++) {
CURLU *p = curl_url();
curl_url_set(p, CURLUPART_URL, list[u], options[o]);
curl_url_cleanup(p);
count++;
}
}
}
gettimeofday(&end, NULL);
diff = end.tv_sec-start.tv_sec;
us = diff * 1000000 + end.tv_usec-start.tv_usec;
printf("%d URLs in %.5f secs, %.3f us/URL, %.3f URLs/sec\n",
count, (double)us/1000000.0, (double)us/count, count / (us/1000000.0));
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment