|  | 
|  | 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