Skip to content

Commit b2be6e4

Browse files
lemireDaniel Lemire
and
Daniel Lemire
authored
adding percent-decoded search-params benchmark (#477)
* adding percent-decoded search-params benchmark * Adding empty line --------- Co-authored-by: Daniel Lemire <[email protected]>
1 parent ff0c467 commit b2be6e4

File tree

2 files changed

+348
-0
lines changed

2 files changed

+348
-0
lines changed

benchmarks/CMakeLists.txt

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# bench_search_params
2+
add_executable(bench_search_params bench_search_params.cpp)
3+
target_link_libraries(bench_search_params PRIVATE ada)
4+
15
# Bench
26
add_executable(wpt_bench wpt_bench.cpp)
37
target_link_libraries(wpt_bench PRIVATE ada)
@@ -54,6 +58,7 @@ target_link_libraries(bench PRIVATE benchmark::benchmark)
5458
target_link_libraries(benchdata PRIVATE benchmark::benchmark)
5559
target_link_libraries(bbc_bench PRIVATE benchmark::benchmark)
5660
target_link_libraries(percent_encode PRIVATE benchmark::benchmark)
61+
target_link_libraries(bench_search_params PRIVATE benchmark::benchmark)
5762

5863
option(ADA_COMPETITION "Whether to install various competitors." OFF)
5964

benchmarks/bench_search_params.cpp

+343
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,343 @@
1+
#include "benchmark_header.h"
2+
3+
/**
4+
* Realistic URL examples collected from Indeed.com, see
5+
* https://github.com/ada-url/ada/pull/459#issuecomment-1624187633
6+
*/
7+
std::string url_examples_default[] = {
8+
"https://secure.indeed.com/"
9+
"auth?continue=https%3A%2F%2Fm5.apply.indeed.com%2Fbeta%2Findeedapply%"
10+
"2Fresumeapply%3FdraftId%3Dd2f89678-c675-4dd6-8776-c7de2df808cc-Y21o%"
11+
"26draftDc%3Dcmh%26postUrl%3Dhttp%253A%252F%252Fmuffit%252Fprocess-"
12+
"indeedapply%26jk%3D4ce8c8f85737012d%26mob%3D0%26referer%3Dhttps%253A%252F%"
13+
"252Fwww.indeed.com%252F%26formParent%3D%26hl%3Den_US%26jobTitle%"
14+
"3DEmbedded%2BSoftware%2BEngineer%26questions%3Diq%253A%252F%"
15+
"252F5a5f158dfd632ec505eb%253Fv%253D1%26twoPaneVjAllocId%3D%"
16+
"26onappliedstatus%3D_updateIndeedApplyStatus%26preload%3D0%26autoString%"
17+
"3Dnone%26iip%3D1%26recentsearchquery%3D%257B%2522what%2522%253A%"
18+
"2522software%2Bengineer%2522%252C%2522where%2522%253A%2522austin%252C%"
19+
"2Btx%2522%257D%26isCreateIAJobApiSuccess%3Dfalse%26onclose%"
20+
"3DindeedApplyHandleModalClose%26onContinueClick%"
21+
"3DindeedApplyHandleModalClose%26jobUrl%3Dhttps%253A%252F%252Fwww.indeed."
22+
"com%252Fviewjob%253Fjk%253D4ce8c8f85737012d%26onready%3D_onButtonReady%"
23+
"26onapplied%3DindeedApplyHandleApply%26href%3Dhttps%253A%252F%252Fwww."
24+
"indeed.com%252Fviewjob%253Fjk%253D4ce8c8f85737012d%2526from%253Dmobhp_"
25+
"jobfeed_auto%2526tk%253D1h4m9jbiui7lq801%2526viewtype%253Dembedded%"
26+
"2526advn%253D2919294681304046%2526adid%253D409899006%2526xkcb%253DSoCq-_"
27+
"M3NWbCoeUCiZ0LbzkdCdPP%2526topwindowlocation%253D%25252F%26coverletter%"
28+
"3DOPTIONAL%26resume%3Drequired%26twoPaneAllocId%3D%26jobMeta%3D%257B%"
29+
"2526quot%253Bvtk%2526quot%253B%253A%2526quot%253B1h4m9jddo28q3001%"
30+
"2526quot%253B%252C%2526quot%253Btk%2526quot%253B%253A%2526quot%"
31+
"253B1h4m9jbiui7lq801%2526quot%253B%257D%26src%3Didd%26ms%3D1688670424981%"
32+
"26jobCompany%3DSigmaSense%252C%2BLLC%26onclick%"
33+
"3DindeedApplyHandleButtonClick%26pingbackUrl%3Dhttps%253A%252F%252Fgdc."
34+
"indeed.com%252Fconv%252ForgIndApp%253Fco%253DUS%2526vjtk%"
35+
"253D1h4m9jddo28q3001%2526jk%253D4ce8c8f85737012d%2526mvj%253D0%2526tk%"
36+
"253D1h4m9jbiui7lq801%2526trk.origin%253Djobsearch%2526sj%253D1%2526vjfrom%"
37+
"253Dmobhp_jobfeed_auto%2526advn%253D2919294681304046%2526adid%"
38+
"253D409899006%2526ad%253D-6NYlbfkN0BLmp7eN89U-"
39+
"imdIS3k1HPy83nFSQVS0CyWSe3vCO57TwIlXkEWIh-"
40+
"pJhJKr5e0ECbg2AnsbYecK2l6IQRkcmJAo04wMd0HwXw9frAU8JSwJ1mjwcEN4QeCXiILN_"
41+
"wIA4Wr_ywZCGdozVPXXsoaJzqbyZBeGNAHJQuiHvWOxPzh1LKLSr_"
42+
"pFbOxn1NmCOkmvvMW36P569CcM6K7a7vOkj32OJUAg8NT_"
43+
"oipaaUGwXpvKlH6ebfTW6B3WWuJtZ9tsQNwH330zZOVkF1mhjr837W2e-OaEjikG0Nrqh-"
44+
"9DFBdDUmSLosfcp0hGtARFGYWfp7xU-897-fsivVLte1sPZhzSqWn9P_"
45+
"D9hHnfmG2LZnTVBp3Jx6QcGng4-U5K8v9KFx7XN9GjcqQum735VDirUpQ61ZT-"
46+
"WOT5Ilm1xI3nNocOcUQJELhqt6WiAgSIyvTKw7SAfCj2fzp0DshQHzxqVdhe-"
47+
"iJ9apJI0JWZa195l_ZNFYvu8-rusj79RaBev9_"
48+
"LPbejUXOZON2MDA37bFHRZsyWNXOCCKl0tswubGZku70sD7HVHm5aYYINKdL_"
49+
"uKogRuW4r7C99AU69eZMUJF78gl%2526xkcb%253DSoCq-_M3NWbCoeUCiZ0LbzkdCdPP%"
50+
"2526astse%253Dad9474a7b6ec862d%2526assa%253D8360%26co%3DUS%26advNum%"
51+
"3D2919294681304046%26noButtonUI%3Dtrue%26iaUid%3D1h4m9je9qjcbf800%26spn%"
52+
"3D1%26jobId%3D5a5f158dfd632ec505eb%26isITA%3D0%26apiToken%"
53+
"3Daa102235a5ccb18bd3668c0e14aa3ea7e2503cfac2a7a9bf3d6549899e125af4%"
54+
"26jobLocation%3DAustin%252C%2BTX%2B78758%26twoPaneGroup%3D-1%"
55+
"26indeedcsrftoken%3D7bG1QaY6YSlr3rfgMbu9YRVPyk1v2TF0%26phone%3DOPTIONAL%"
56+
"26jobApplies%3D-1%26twoPaneVjGroup%3D-1%26returnToJobSearchUrl%3Dhttp%"
57+
"253A%252F%252Fwww.indeed.com%252F%26indeedApplyableJobApiURI%3D&cfb=2&obo="
58+
"http%3A%2F%2Fwww.indeed.com%2F&hl=en_US&from=indapply-login-SmartApply&"
59+
"branding=indeed-apply",
60+
//
61+
"https://secure.indeed.com/"
62+
"auth?continue=https%3A%2F%2Fm5.apply.indeed.com%2Fbeta%2Findeedapply%"
63+
"2Fresumeapply%3FdraftId%3Dcd45b794-ede7-48a2-a143-6023319e90a4-Y21o%"
64+
"26draftDc%3Dcmh%26postUrl%3Dhttps%253A%252F%252Fapply.workable.com%"
65+
"252Fapi%252Fv1%252Fjobboards%252Findeed%252Fjobs%252FEC33BF8806%252Fapply%"
66+
"26jk%3D0ffb6f7ed64d3bae%26mob%3D0%26referer%3Dhttps%253A%252F%252Fwww."
67+
"indeed.com%252F%26formParent%3D%26hl%3Den_US%26jobTitle%3DEmbedded%"
68+
"2BSoftware%2BEngineer%26questions%3Dhttps%253A%252F%252Fapply.workable."
69+
"com%252Fapi%252Fv1%252Fjobboards%252Findeed%252Fjobs%252FEC33BF8806%"
70+
"252Fquestions%26twoPaneVjAllocId%3D%26onappliedstatus%3D_"
71+
"updateIndeedApplyStatus%26preload%3D0%26autoString%3Dnone%26iip%3D1%"
72+
"26recentsearchquery%3D%257B%2522what%2522%253A%2522software%2Bengineer%"
73+
"2522%252C%2522where%2522%253A%2522austin%252C%2Btx%2522%257D%"
74+
"26isCreateIAJobApiSuccess%3Dfalse%26onclose%3DindeedApplyHandleModalClose%"
75+
"26onContinueClick%3DindeedApplyHandleModalClose%26jobUrl%3Dhttps%253A%"
76+
"252F%252Fwww.indeed.com%252Fviewjob%253Fjk%253D0ffb6f7ed64d3bae%26onready%"
77+
"3D_onButtonReady%26onapplied%3DindeedApplyHandleApply%26href%3Dhttps%253A%"
78+
"252F%252Fwww.indeed.com%252Fviewjob%253Fjk%253D0ffb6f7ed64d3bae%2526from%"
79+
"253Dhp%2526tk%253D1h4m9jbiui7lq801%2526viewtype%253Dembedded%2526advn%"
80+
"253D2169897021852324%2526adid%253D412530207%2526xkcb%253DSoDv-_"
81+
"M3NWbCoe0CiZ0LbzkdCdPP%2526topwindowlocation%253D%25252F%26coverletter%3D%"
82+
"26twoPaneAllocId%3D%26src%3Didd%26ms%3D1688670502027%26jobCompany%3DShift%"
83+
"2BRobotics%26onclick%3DindeedApplyHandleButtonClick%26pingbackUrl%3Dhttps%"
84+
"253A%252F%252Fgdc.indeed.com%252Fconv%252ForgIndApp%253Fco%253DUS%"
85+
"2526vjtk%253D1h4m9ltcgii2t800%2526jk%253D0ffb6f7ed64d3bae%2526mvj%253D0%"
86+
"2526tk%253D1h4m9jbiui7lq801%2526trk.origin%253Djobsearch%2526sj%253D1%"
87+
"2526vjfrom%253Dhp%2526advn%253D2169897021852324%2526adid%253D412530207%"
88+
"2526ad%253D-6NYlbfkN0ADTLHW1lVcttxG1n9WEfcRI1-"
89+
"ixIWqaQXrnishWQ6BGJjne4HH5OGRzbL9TFjFzxuxk65rhcUupJlJ21QkpPLqd89n0B4cMJw-"
90+
"xmaYdF9-dzypunDDP4jQEuuhT-tpejJCNc8jlBI6FGBAtkAXuipq96Z-"
91+
"vOtd24jCWqboqknQBia2fKh5sYbqLv3E7C6vlBmxO2FH4-qm1_"
92+
"vkeeUq1lsktOtkKCFK2RSR5V5xbkBHcu0hkuZAShjpg2ro3F4e9VbP5_"
93+
"tC3BKSqdL9un4SibeC59V880-mAhOnU_"
94+
"yhuURbniZCCFxjEH66D3euJEOSBZDVnpK0jsbAbxwAnx9dtEdC_"
95+
"HG3BG2PgUf9uwPA8SgdtHuhTAkToYjDBF1l5ENrF3WSXIMTCANToEbE3FpgMwNgOkTDf_"
96+
"4E0Zf-vZ5LjmNY_8q8gL9SwhL6dAsnb-iH5Nm9OGEI32LTlhl9KtszAFZ99UGlzmRjo_"
97+
"iD7ienJa3zd_Ebh_NZWkb_4pEKal6--pSAPlVPbC6azvhPiBzQgMhzpUS9Z-7YYhU%25253D%"
98+
"2526xkcb%253DSoDv-_M3NWbCoe0CiZ0LbzkdCdPP%2526astse%253Dc630be9cfe791df9%"
99+
"2526assa%253D240%26co%3DUS%26advNum%3D2169897021852324%26noButtonUI%"
100+
"3Dtrue%26iaUid%3D1h4m9lujpkblm800%26spn%3D1%26jobId%3D5F6DD26C1B%26isITA%"
101+
"3D0%26apiToken%"
102+
"3D3a51613a4d8b9799d352130065868b0c34bce36cee7f4dffa3ed16b0c7936634%"
103+
"26jobLocation%3DAustin%252C%2BTexas%252C%2BUnited%2BStates%26twoPaneGroup%"
104+
"3D-1%26indeedcsrftoken%3D7bG1QaY6YSlr3rfgMbu9YRVPyk1v2TF0%26phone%"
105+
"3Doptional%26jobApplies%3D-1%26twoPaneVjGroup%3D-1%26returnToJobSearchUrl%"
106+
"3Dhttp%253A%252F%252Fwww.indeed.com%252F%26indeedApplyableJobApiURI%3D&"
107+
"cfb=2&obo=http%3A%2F%2Fwww.indeed.com%2F&hl=en_US&from=indapply-login-"
108+
"SmartApply&branding=indeed-apply",
109+
//
110+
"https://secure.indeed.com/"
111+
"auth?hl=en_US&co=US&continue=https%3A%2F%2Fwww.indeed.com%"
112+
"2Fthirdpartysignin%3Fjk%3D67557c870d9debaf%26from%3Dhp%26from%3Djsfe-"
113+
"3pintercept-viewjob%26tk%3D1h4m9jbiui7lq801%26viewtype%3Dembedded%26advn%"
114+
"3D8187210054516026%26adid%3D378267801%26ad%3D-6NYlbfkN0CfpH2aSe_"
115+
"yWN7pjV6WFrWU4hEZi9Btn9eCdDUBIhjK5M5mY81rEexvugfeSup1QuHOvw9d5hvgsJ79xiL2b"
116+
"Cis9Y8r23bY8qvwxN3cXtMQH5eaPpn4zk1QcFRVOjQFg-"
117+
"0YX6StKUcjnJroSlWw3vVqor9zKJ4mUJ-Ksql7DBTYyyZGXojbnMo-"
118+
"neBlW1zDoHnAAl1ZZZa38U8p1jl35T8o9uwhvY3mVw2XDdmKpKawVuyFfiNGl3_"
119+
"jyLBWarAGLeTBHVsVlBONBK8GK4zH1pVL31V4M43uQUjWUhjRqH4lnq92jt7uCHE97bhKm2hMo"
120+
"6dpJ6I-"
121+
"1REKDf9gE0gloVW3r2lBI2TpIWbePg2zuBg4CnvYaRAm7elrbL8hYuiPYtB3hjTkldS_IYH3-"
122+
"NgunawHQ-"
123+
"LwIxAO35DyDhaY1DrGuFWaTQj6f1JlddpnImKhUaKP3jgV0q9uKoQxvyyFhLOlLGDxfMsVecGZ"
124+
"B4lwuUK0TE74Qix1iR26X1QtEguPk8yp8DQZ-AfOqT_"
125+
"S7A0PtcI2eI0sLM1y3BHB3p0KdpYJUsDv02t7UYO_gNEmMOmcsr5gLsmE-cu52BF_"
126+
"n2lEDE3kKpIKqMu91dFTmI25H393tb-"
127+
"PfCUfVAVaUveXuO2hjWSctjtFCo9RPl6ix3ilDs1QgKt08BtT4IUb5I24JlxIJXNvkHhkH75vw"
128+
"PH9SHKr5XfuN32rOCTUr9JWLmVEcQ4x5A0pHUXQRyz8OxdfsifIibHB8SpDYTtyY50lSL4sAe3"
129+
"M4PDq0d54xfqWuSQqhGqo0lE944k8JjiQue8M1cIcqpssOOqE8SIi-"
130+
"hDdv1KG0G1kQuLBIYMzzrGCJ6WDZm_KbLiyK0wTrPf2cWfHIyU1JI1pdWKbK6fop_"
131+
"kuNd3OBEAl00YETNwOrg4HrZdK8NXEkG_QWXA-A0nYxFWz58uoHND5rkyVDO0o%26xkcb%"
132+
"3DSoBZ-_M3NWbCoZUCiZ0LbzkdCdPP%26topwindowlocation%3D%252F%253Fadvn%"
133+
"253D2169897021852324%2526vjk%253D0ffb6f7ed64d3bae%26vjtk%"
134+
"3D1h4m9npiq21a4002&from=jsfe-3pintercept-viewjob&branding=third-party-"
135+
"applies",
136+
//
137+
"https://secure.indeed.com/"
138+
"auth?continue=https%3A%2F%2Fm5.apply.indeed.com%2Fbeta%2Findeedapply%"
139+
"2Fresumeapply%3FdraftId%3Dde4f06da-7b31-465c-96d2-80f791a85bf7-Y21o%"
140+
"26draftDc%3Dcmh%26postUrl%3Dhttp%253A%252F%252Fmuffit%252Fprocess-"
141+
"indeedapply%26jk%3D7590bdb1fe928d49%26mob%3D0%26referer%3Dhttps%253A%252F%"
142+
"252Fwww.indeed.com%252F%253Fvjk%253D4ce8c8f85737012d%2526advn%"
143+
"253D2919294681304046%26formParent%3D%26hl%3Den_US%26jobTitle%3DSenior%"
144+
"2BSoftware%2BDeveloper%2B%2528onsite%2529%26questions%3Diq%253A%252F%"
145+
"252F0efc2325f6b4a2c5bc27%253Fv%253D1%26twoPaneVjAllocId%3D%"
146+
"26onappliedstatus%3D_updateIndeedApplyStatus%26preload%3D0%26autoString%"
147+
"3Dnone%26iip%3D1%26recentsearchquery%3D%257B%2522what%2522%253A%"
148+
"2522software%2Bengineer%2522%252C%2522where%2522%253A%2522austin%252C%"
149+
"2Btx%2522%257D%26isCreateIAJobApiSuccess%3Dfalse%26onclose%"
150+
"3DindeedApplyHandleModalClose%26onContinueClick%"
151+
"3DindeedApplyHandleModalClose%26jobUrl%3Dhttps%253A%252F%252Fwww.indeed."
152+
"com%252Fviewjob%253Fjk%253D7590bdb1fe928d49%26onready%3D_onButtonReady%"
153+
"26onapplied%3DindeedApplyHandleApply%26href%3Dhttps%253A%252F%252Fwww."
154+
"indeed.com%252Fviewjob%253Fjk%253D7590bdb1fe928d49%2526from%253Dhp%2526tk%"
155+
"253D1h4m9jbiui7lq801%2526viewtype%253Dembedded%2526advn%"
156+
"253D5522285726153717%2526adid%253D414206073%2526xkcb%253DSoDt-_"
157+
"M3NWbCoZUCiZ0KbzkdCdPP%2526topwindowlocation%253D%25252F%25253Fvjk%"
158+
"25253D4ce8c8f85737012d%252526advn%25253D2919294681304046%26coverletter%"
159+
"3DOPTIONAL%26resume%3Drequired%26twoPaneAllocId%3D%26jobMeta%3D%257B%"
160+
"2526quot%253Bvtk%2526quot%253B%253A%2526quot%253B1h4m9oh7mirks800%"
161+
"2526quot%253B%252C%2526quot%253Btk%2526quot%253B%253A%2526quot%"
162+
"253B1h4m9jbiui7lq801%2526quot%253B%257D%26src%3Didd%26ms%3D1688670587917%"
163+
"26jobCompany%3DCitizens%2BInc%26onclick%3DindeedApplyHandleButtonClick%"
164+
"26pingbackUrl%3Dhttps%253A%252F%252Fgdc.indeed.com%252Fconv%252ForgIndApp%"
165+
"253Fco%253DUS%2526vjtk%253D1h4m9oh7mirks800%2526jk%253D7590bdb1fe928d49%"
166+
"2526mvj%253D0%2526tk%253D1h4m9jbiui7lq801%2526trk.origin%253Djobsearch%"
167+
"2526sj%253D1%2526vjfrom%253Dhp%2526advn%253D5522285726153717%2526adid%"
168+
"253D414206073%2526ad%253D-"
169+
"6NYlbfkN0CHSAkotDdvvZVbhOqFdbxXOHJMhXe1DXuaBPnaU5fYte-"
170+
"aud5Z0lqoqFyp33jrJfy1DYFhCWCqBjAqfX3PBXom-d5E4gy3cqbwZuMtWn4flXO-"
171+
"Fd9DkMZrQjqK002kTnGqvqfkH0ftIspK3hwJPRmAEy7EY87A9OOFRyFmxA9AdiimsdRWyksA-"
172+
"nCQ0w1VI28XDuVMu7qO_D46dH-"
173+
"dtW5jWIG4jTe8HCv21447lFobYgFb9oJdF8NrjyCNP4fdGeojlELmcjS5cvC5dKfXi8IZm4sWW"
174+
"-7b5SBQKvBMmSVDjiTsgYZS6lb8B-"
175+
"a3YF1Lny7hpNfClmOcLe49wiZAG9LWJ7uRUEfzOPrUCwxdHNQK-vEo3ZhDK4AeER-"
176+
"LfOUabNSjrKz7_91l8sQjBNOR-FJ25ioX0sqoNByLfJC7cWzjDxqvW-l82GsWQR2O_"
177+
"6Khe2oq91fjVXMAFQdSQWdr_DWCf_"
178+
"e2FYtN69Qql9maXH550XNcfynxCicTL71xLstYfWqbSMpADJhrW_"
179+
"0pf4x58zLVfYLBJ7MPQaW15uKzbFn68lAlyF5GXDqWxowOm58EyeS7OmQkBdGyxYanZ6452m6O"
180+
"%2526xkcb%253DSoDt-_M3NWbCoZUCiZ0KbzkdCdPP%2526astse%253Db4f6f6ed591bacca%"
181+
"2526assa%253D6102%26co%3DUS%26advNum%3D5522285726153717%26noButtonUI%"
182+
"3Dtrue%26iaUid%3D1h4m9oi2qj4h4800%26spn%3D1%26jobId%"
183+
"3D0efc2325f6b4a2c5bc27%26isITA%3D0%26apiToken%"
184+
"3Daa102235a5ccb18bd3668c0e14aa3ea7e2503cfac2a7a9bf3d6549899e125af4%"
185+
"26jobLocation%3DAustin%252C%2BTX%2B78758%26twoPaneGroup%3D-1%"
186+
"26indeedcsrftoken%3D7bG1QaY6YSlr3rfgMbu9YRVPyk1v2TF0%26phone%3DOPTIONAL%"
187+
"26jobApplies%3D-1%26twoPaneVjGroup%3D-1%26returnToJobSearchUrl%3Dhttp%"
188+
"253A%252F%252Fwww.indeed.com%252F%253Fvjk%253D4ce8c8f85737012d%2526advn%"
189+
"253D2919294681304046%26indeedApplyableJobApiURI%3D&cfb=2&obo=http%3A%2F%"
190+
"2Fwww.indeed.com%2F&hl=en_US&from=indapply-login-SmartApply&branding="
191+
"indeed-apply"};
192+
193+
std::vector<std::string> url_examples;
194+
195+
double url_examples_bytes = []() -> double {
196+
size_t bytes{0};
197+
for (std::string& url_string : url_examples) {
198+
bytes += url_string.size();
199+
}
200+
return double(bytes);
201+
}();
202+
203+
#ifdef ADA_URL_FILE
204+
const char* default_file = ADA_URL_FILE;
205+
#else
206+
const char* default_file = nullptr;
207+
#endif
208+
209+
size_t init_data(const char* input = default_file) {
210+
// compute the number of bytes.
211+
auto compute = []() -> double {
212+
size_t bytes{0};
213+
for (std::string& url_string : url_examples) {
214+
bytes += url_string.size();
215+
}
216+
return double(bytes);
217+
};
218+
if (input == nullptr) {
219+
for (const std::string& s : url_examples_default) {
220+
url_examples.emplace_back(s);
221+
}
222+
url_examples_bytes = compute();
223+
return url_examples.size();
224+
}
225+
226+
if (!file_exists(input)) {
227+
std::cout << "File not found !" << input << std::endl;
228+
for (const std::string& s : url_examples_default) {
229+
url_examples.emplace_back(s);
230+
}
231+
} else {
232+
std::cout << "Loading " << input << std::endl;
233+
url_examples = split_string(read_file(input));
234+
}
235+
url_examples_bytes = compute();
236+
return url_examples.size();
237+
}
238+
239+
size_t count_ada_invalid() {
240+
size_t how_many = 0;
241+
for (std::string& url_string : url_examples) {
242+
auto url = ada::parse(url_string);
243+
if (!url) {
244+
how_many++;
245+
}
246+
}
247+
return how_many;
248+
}
249+
250+
template <class result_type = ada::url_aggregator>
251+
static void BasicBench_AdaURL(benchmark::State& state) {
252+
// volatile to prevent optimizations.
253+
volatile size_t param_count = 0;
254+
255+
for (auto _ : state) {
256+
for (std::string& url_string : url_examples) {
257+
ada::result<result_type> url = ada::parse<result_type>(url_string);
258+
if (url) {
259+
auto params = ada::url_search_params{url->get_search()};
260+
param_count += params.size();
261+
}
262+
}
263+
}
264+
if (collector.has_events()) {
265+
event_aggregate aggregate{};
266+
for (size_t i = 0; i < N; i++) {
267+
std::atomic_thread_fence(std::memory_order_acquire);
268+
collector.start();
269+
for (std::string& url_string : url_examples) {
270+
ada::result<result_type> url = ada::parse<result_type>(url_string);
271+
if (url) {
272+
auto params = ada::url_search_params{url->get_search()};
273+
param_count += params.size();
274+
}
275+
}
276+
std::atomic_thread_fence(std::memory_order_release);
277+
event_count allocate_count = collector.end();
278+
aggregate << allocate_count;
279+
}
280+
state.counters["cycles/url"] =
281+
aggregate.best.cycles() / std::size(url_examples);
282+
state.counters["instructions/url"] =
283+
aggregate.best.instructions() / std::size(url_examples);
284+
state.counters["instructions/cycle"] =
285+
aggregate.best.instructions() / aggregate.best.cycles();
286+
state.counters["instructions/byte"] =
287+
aggregate.best.instructions() / url_examples_bytes;
288+
state.counters["instructions/ns"] =
289+
aggregate.best.instructions() / aggregate.best.elapsed_ns();
290+
state.counters["GHz"] =
291+
aggregate.best.cycles() / aggregate.best.elapsed_ns();
292+
state.counters["ns/url"] =
293+
aggregate.best.elapsed_ns() / std::size(url_examples);
294+
state.counters["cycle/byte"] = aggregate.best.cycles() / url_examples_bytes;
295+
}
296+
(void)param_count;
297+
state.counters["time/byte"] = benchmark::Counter(
298+
url_examples_bytes, benchmark::Counter::kIsIterationInvariantRate |
299+
benchmark::Counter::kInvert);
300+
state.counters["time/url"] =
301+
benchmark::Counter(double(std::size(url_examples)),
302+
benchmark::Counter::kIsIterationInvariantRate |
303+
benchmark::Counter::kInvert);
304+
state.counters["speed"] = benchmark::Counter(
305+
url_examples_bytes, benchmark::Counter::kIsIterationInvariantRate);
306+
state.counters["url/s"] =
307+
benchmark::Counter(double(std::size(url_examples)),
308+
benchmark::Counter::kIsIterationInvariantRate);
309+
}
310+
311+
auto url_search_params_AdaURL = BasicBench_AdaURL<ada::url_aggregator>;
312+
BENCHMARK(url_search_params_AdaURL);
313+
314+
int main(int argc, char** argv) {
315+
if (argc > 1 && file_exists(argv[1])) {
316+
init_data(argv[1]);
317+
} else {
318+
init_data();
319+
}
320+
#if (__APPLE__ && __aarch64__) || defined(__linux__)
321+
if (!collector.has_events()) {
322+
benchmark::AddCustomContext("performance counters",
323+
"No privileged access (sudo may help).");
324+
}
325+
#else
326+
if (!collector.has_events()) {
327+
benchmark::AddCustomContext("performance counters", "Unsupported system.");
328+
}
329+
#endif
330+
benchmark::AddCustomContext("input bytes",
331+
std::to_string(size_t(url_examples_bytes)));
332+
benchmark::AddCustomContext("number of URLs",
333+
std::to_string(std::size(url_examples)));
334+
benchmark::AddCustomContext(
335+
"bytes/URL",
336+
std::to_string(url_examples_bytes / std::size(url_examples)));
337+
if (collector.has_events()) {
338+
benchmark::AddCustomContext("performance counters", "Enabled");
339+
}
340+
benchmark::Initialize(&argc, argv);
341+
benchmark::RunSpecifiedBenchmarks();
342+
benchmark::Shutdown();
343+
}

0 commit comments

Comments
 (0)