File
Blob: src/workerd/tests/bench-regex.c++
| 1 | // Copyright (c) 2023 Cloudflare, Inc. |
| 2 | // Licensed under the Apache 2.0 license found in the LICENSE file or at: |
| 3 | // https://opensource.org/licenses/Apache-2.0 |
| 4 | |
| 5 | #include <workerd/tests/bench-tools.h> |
| 6 | #include <workerd/tests/test-fixture.h> |
| 7 | |
| 8 | #include <kj/test.h> |
| 9 | |
| 10 | // A benchmark for regular expressions performance. Note that this is at least in part benchmarking |
| 11 | // V8's Regex implementation. |
| 12 | |
| 13 | namespace workerd { |
| 14 | namespace { |
| 15 | |
| 16 | struct RegExpBenchmark: public benchmark::Fixture { |
| 17 | virtual ~RegExpBenchmark() noexcept(true) {} |
| 18 | |
| 19 | void SetUp(benchmark::State& state) noexcept(true) override { |
| 20 | TestFixture::SetupParams params = {.mainModuleSource = R"( |
| 21 | export default { |
| 22 | async fetch(request, env, ctx) { |
| 23 | const body = await request.text(); |
| 24 | // Common english language words, derived from "12dicts", which is in the public domain. |
| 25 | // The first 600 words were chosen to have words with shared substrings and require compiling a longer expression. |
| 26 | const dict_exp = new RegExp("^(A|a|aback|abacus|abandon|abandoned|abandonment|abashed|abate|abbey|abbr.|abbreviate|abbreviation|ABC|ABC's|abdicate|abdication|abdomen|abdominal|abduct|abduction|aberration|abet|abhor|abhorrence|abhorrent|abide|abiding|ability|abject|ablaze|able|able-bodied|ably|abnormal|abnormality|abnormally|aboard|abolish|abolition|abolitionist|abominable|aboriginal|aborigine|abort|abortion|abortive|abound|about|about-face|above|aboveboard|abrasive|abrasively|abreast|abridge|abridgment|abroad|abrupt|abruptly|abruptness|abscess|abscond|absence|absent|absentee|absenteeism|absently|absent-minded|absent-mindedly|absent-mindedness|absolute|absolutely|absolve|absorb|absorbed|absorbent|absorbing|absorption|abstain|abstention|abstinence|abstinent|abstract|abstraction|absurd|absurdity|absurdly|abundance|abundant|abundantly|abuse|abusive|abysmal|abysmally|abyss|AC|academic|academically|academy|accelerate|acceleration|accelerator|accent|accented|accentuate|accept|acceptability|acceptable|acceptably|acceptance|accepted|access|accessibility|accessible|accessory|accident|accidental|accidentally|accident-prone|acclaim|acclaimed|acclimate|acclimation|accolade|accommodate|accommodating|accommodation|accommodations|accompaniment|accompanist|accompany|accomplice|accomplish|accomplished|accomplishment|accord|accordance|accordingly|according to|accordion|accost|account|accountability|accountable|accountant|accounting|accreditation|accredited|accrue|accumulate|accumulation|accuracy|accurate|accurately|accusation|accuse|accused|accuser|accusing|accusingly|accustom|accustomed|ace|acerbic|ache|achieve|achievement|achiever|Achilles' heel|achy|acid|acidic|acidity|acid rain|acknowledge|acknowledged|acknowledgment|acne|acorn|acoustic|acoustics|acquaint|acquaintance|acquainted|acquiesce|acquiescence|acquire|acquisition|acquit|acquittal|acre|acrid|acrimonious|acrimony|acrobat|acrobatic|acrobatics|acronym|across|across from|across-the-board|acrylic|ACT|act|acting|action|activate|activation|active|activism|activist|activity|actor|actress|actual|actuality|actualization|actually|acumen|acupuncture|acute|acute angle|acutely|ad|A.D.|adage|adamant|adamantly|Adam's apple|adapt|adaptable|adaptation|adapter|add|addict|addicted|addiction|addictive|addition|additional|additionally|additive|address|adept|adeptly|adequacy|adequate|adequately|adhere|adherence|adherent|adhesion|adhesive|ad hoc|adjacent|adjectival|adjective|adjoin|adjoining|adjourn|adjournment|adjudicate|adjudicator|adjunct|adjust|adjustable|adjustment|ad lib|ad-lib|administer|administration|administrative|administrator|admirable|admirably|admiral|admiration|admire|admirer|admiring|admiringly|admissible|admission|admit|admittance|admittedly|admonish|admonition|adobe|adolescence|adolescent|adopt|adopted|adoption|adoptive|adorable|adoration|adore|adorn|adornment|adrenaline|adrift|adroit|adroitly|adulation|adult|adulterate|adulteration|adultery|advance|advanced|advancement|advantage|advantageous|Advent|advent|adventure|adventurer|adventurous|adverb|adverbial|adversary|adverse|adversely|adversity|advertise|advertisement|advertiser|advertising|advice|advisable|advise|adviser|advisory|advocacy|advocate|aerial|aerobic|aerobics|aerodynamic|aerodynamics|aerosol|aerospace|aesthetic|aesthetically|aesthetics|afar|affable|affably|affair|affairs|affect|affectation|affected|affection|affectionate|affectionately|affidavit|affiliate|affiliated|affiliation|affinity|affirm|affirmation|affirmative|affirmative action|affirmatively|affix|afflict|affliction|affluence|affluent|afford|affordable|affront|afloat|afraid|afresh|Africa|African|African-American|after|aftereffect|afterlife|aftermath|afternoon|aftershave|aftershock|afterthought|afterward|afterwards|again|against|age|aged|agency|agenda|agent|ages|aggravate|aggravating|aggravation|aggression|aggressive|aggressively|aggressiveness|aggressor|aggrieved|aghast|agile|agility|aging|agitate|agitated|agitation|agitator|agnostic|agnosticism|ago|agonize|agonized|agonizing|agonizingly|agony|agree|agreeable|agreeably|agreed|agreement|agricultural|agriculture|ah|aha|ahead|aid|aide|AIDS|ailing|ailment|aim|aimless|aimlessly|ain't|air|air bag|air base|airborne|air-conditioned|air conditioner|air conditioning|aircraft|aircraft carrier|airfare|airfield|air force|airily|airing|airless|airline|airliner|airmail|airplane|airport|air raid|airs|airspace|airstrip|airtight|air time|air traffic controller|airwaves|airy|aisle|ajar|akin|a la carte|a la mode|alarm|alarm clock|alarmed|alarming|alarmingly|alarmist|alas|albeit|albino|album|alcohol|alcoholic|alcoholism|alcove|alderman|alderwoman|ale|alert|alfalfa|algae|algebra|algebraic|algorithm|alias|alibi|alien|alienate|alienation|alight|align|alignment|alike|alimony|alive|alkali|alkaline|all|Allah|all-American|all-around|allay|all-clear|allegation|allege|alleged|allegedly|allegiance|allegorical|allegory|allergic|allergy|alleviate|alleviation|alley|alliance|allied|alligator|all-inclusive|allocate|allocation|allot|allotment|all-out|allow|allowable|allowance|alloy|all right|all-star|allude|allure|alluring|allusion|ally|alma mater|almanac|almighty|almond|almost|alms|aloft|aloha|alone|along|alongside|aloof|aloud|alphabet|alphabetical|alphabetically|alpine|already|alright|also|altar|alter|alteration|altercation|alternate|alternately|alternation|alternative|alternatively|although|altitude|alto|altogether|altruism|altruistic|aluminum|alumna|alumnae|alumni|alumnus|always|AM|am|A.M.|amalgamate|amalgamation|amass|amateur)$"); |
| 27 | if (dict_exp.test(body)) { |
| 28 | return new Response("word found in dictionary"); |
| 29 | } |
| 30 | return new Response("error: word not found", {status: 400}); |
| 31 | } |
| 32 | } |
| 33 | )"_kj}; |
| 34 | fixture = kj::heap<TestFixture>(kj::mv(params)); |
| 35 | } |
| 36 | |
| 37 | void TearDown(benchmark::State& state) noexcept(true) override { |
| 38 | fixture = nullptr; |
| 39 | } |
| 40 | |
| 41 | kj::Own<TestFixture> fixture; |
| 42 | }; |
| 43 | |
| 44 | BENCHMARK_F(RegExpBenchmark, request)(benchmark::State& state) { |
| 45 | for (auto _: state) { |
| 46 | auto result = |
| 47 | fixture->runRequest(kj::HttpMethod::POST, "http://www.example.com"_kj, "accepted"_kj); |
| 48 | KJ_EXPECT(result.statusCode == 200 && result.body == "word found in dictionary"_kj); |
| 49 | auto result2 = |
| 50 | fixture->runRequest(kj::HttpMethod::POST, "http://www.example.com"_kj, "invalid"_kj); |
| 51 | KJ_EXPECT(result2.statusCode == 400 && result2.body == "error: word not found"_kj); |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | } // namespace |
| 56 | } // namespace workerd |