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