Last active
September 6, 2022 14:01
-
-
Save bagder/dac962c022171a212c54221afc4b99d2 to your computer and use it in GitHub Desktop.
speedparse -- bechmark the the libcurl URL parser
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*************************************************************************** | |
* _ _ ____ _ | |
* 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