brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.8 KiB · 7cf2143 Raw
236 lines · cpp
1#include "benchmark/benchmark.h"2#include "llvm/ADT/SmallString.h"3#include "llvm/ADT/StringRef.h"4#include "llvm/Support/MemoryBuffer.h"5#include "llvm/Support/SpecialCaseList.h"6#include "llvm/Support/raw_ostream.h"7#include <cassert>8#include <random>9#include <string>10#include <utility>11#include <vector>12 13using namespace llvm;14 15namespace {16constexpr int RNG_SEED = 123456;17constexpr int MAX_LIST_MIN = 10;18constexpr int MAX_LIST_MAX = 1000000;19constexpr int MAX_LIST_MUL = 10;20 21std::unique_ptr<SpecialCaseList> makeSpecialCaseList(StringRef List) {22  std::string Error;23  std::unique_ptr<MemoryBuffer> MB = MemoryBuffer::getMemBuffer(List);24  auto SCL = SpecialCaseList::create(MB.get(), Error);25  assert(SCL);26  assert(Error == "");27  return SCL;28}29 30static const std::string Dictionary[] = {31    "orange",   "tabby",  "tortie", "tuxedo", "void",32    "multiple", "spaces", "cute",   "fluffy", "kittens",33};34 35std::vector<std::string> genFiles(size_t NumFiles) {36  std::vector<std::string> R;37  R.reserve(NumFiles);38  std::minstd_rand Rng(RNG_SEED);39  std::uniform_int_distribution<> DepthDistrib(8, 16);40  std::uniform_int_distribution<> WordDistrib(0, std::size(Dictionary) - 1);41 42  std::string S;43  for (size_t I = 0; I < NumFiles; ++I) {44    for (size_t D = DepthDistrib(Rng); D; --D) {45      S += Dictionary[WordDistrib(Rng)];46      if (D > 1)47        S += "/";48    }49    R.push_back(std::move(S));50    S.clear();51  }52  return R;53}54 55std::string genGlobNone(const std::vector<std::string> &Files) {56  std::string S;57  for (const auto &F : Files) {58    S += "src:";59    S += F;60    S += "\n";61  }62  return S;63}64 65std::string genGlobInMid(const std::vector<std::string> &Files) {66  std::string S;67  std::minstd_rand Rng(RNG_SEED);68  for (std::string F : Files) {69    std::uniform_int_distribution<> PosDistrib(0, F.size() - 1);70    F[PosDistrib(Rng)] = '*';71    S += "src:";72    S += F;73    S += "\n";74  }75  return S;76}77 78std::string genGlobAtStart(const std::vector<std::string> &Files) {79  std::string S;80  for (std::string F : Files) {81    F.front() = '*';82    S += "src:";83    S += F;84    S += "\n";85  }86  return S;87}88 89std::string genGlobAtEnd(const std::vector<std::string> &Files) {90  std::string S;91  for (std::string F : Files) {92    F.back() = '*';93    S += "src:";94    S += F;95    S += "\n";96  }97  return S;98}99 100std::string genGlobAtBothSides(const std::vector<std::string> &Files) {101  std::string S;102  for (std::string F : Files) {103    F.back() = '*';104    F.front() = '*';105    S += "src:";106    S += F;107    S += "\n";108  }109  return S;110}111 112std::string genGlobAtBothSidesAndMid(const std::vector<std::string> &Files) {113  std::string S;114  std::minstd_rand Rng(RNG_SEED);115  for (std::string F : Files) {116    std::uniform_int_distribution<> PosDistrib(0, F.size() - 1);117    F[PosDistrib(Rng)] = '*';118 119    std::uniform_int_distribution<> Ends(0, 1);120    if (Ends(Rng)) {121      F.back() = '*';122      F.front() = '*';123    }124 125    S += "src:";126    S += F;127    S += "\n";128  }129  return S;130}131 132void BM_Make_(133    benchmark::State &state,134    std::string (*GenerateCaseList)(const std::vector<std::string> &Files)) {135  std::vector<std::string> BigFileList = genFiles(state.range(0));136  std::string BigCaseList = GenerateCaseList(BigFileList);137  for (auto _ : state) {138    auto SCL = makeSpecialCaseList(BigCaseList);139    benchmark::DoNotOptimize(SCL);140  }141}142void BM_True_(143    benchmark::State &state,144    std::string (*GenerateCaseList)(const std::vector<std::string> &Files)) {145  std::vector<std::string> BigFileList = genFiles(state.range(0));146  std::string BigCaseList = GenerateCaseList(BigFileList);147  auto SCL = makeSpecialCaseList(BigCaseList);148  std::minstd_rand Rng(RNG_SEED);149  std::uniform_int_distribution<> LineDistrib(0, BigFileList.size() - 1);150  for (auto _ : state) {151    auto &Q = BigFileList[LineDistrib(Rng)];152    bool R = SCL->inSection("", "src", Q);153    if (!R)154      abort();155    benchmark::DoNotOptimize(R);156  }157}158 159void BM_False(160    benchmark::State &state,161    std::string (*GenerateCaseList)(const std::vector<std::string> &Files)) {162  std::vector<std::string> BigFileList = genFiles(state.range(0));163  std::string BigCaseList = GenerateCaseList(BigFileList);164  auto SCL = makeSpecialCaseList(BigCaseList);165  std::minstd_rand Rng(RNG_SEED);166  std::uniform_int_distribution<> LineDistrib(0, BigFileList.size() - 1);167  for (auto _ : state) {168    std::string Q = BigFileList[LineDistrib(Rng)];169    std::uniform_int_distribution<> PosDistrib(0, Q.size() - 1);170    Q[PosDistrib(Rng)] = '_';171    bool R = SCL->inSection("", "src", Q);172    benchmark::DoNotOptimize(R);173  }174}175 176} // namespace177 178BENCHMARK_CAPTURE(BM_Make_, None_, genGlobNone)179    ->RangeMultiplier(MAX_LIST_MUL)180    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);181BENCHMARK_CAPTURE(BM_Make_, Start, genGlobAtStart)182    ->RangeMultiplier(MAX_LIST_MUL)183    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);184BENCHMARK_CAPTURE(BM_Make_, End__, genGlobAtEnd)185    ->RangeMultiplier(MAX_LIST_MUL)186    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);187BENCHMARK_CAPTURE(BM_Make_, Mid__, genGlobInMid)188    ->RangeMultiplier(MAX_LIST_MUL)189    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);190BENCHMARK_CAPTURE(BM_Make_, Both_, genGlobAtBothSides)191    ->RangeMultiplier(MAX_LIST_MUL)192    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);193BENCHMARK_CAPTURE(BM_Make_, Mix__, genGlobAtBothSidesAndMid)194    ->RangeMultiplier(MAX_LIST_MUL)195    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);196 197BENCHMARK_CAPTURE(BM_True_, None_, genGlobNone)198    ->RangeMultiplier(MAX_LIST_MUL)199    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);200BENCHMARK_CAPTURE(BM_True_, Start, genGlobAtStart)201    ->RangeMultiplier(MAX_LIST_MUL)202    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);203BENCHMARK_CAPTURE(BM_True_, End__, genGlobAtEnd)204    ->RangeMultiplier(MAX_LIST_MUL)205    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);206BENCHMARK_CAPTURE(BM_True_, Mid__, genGlobInMid)207    ->RangeMultiplier(MAX_LIST_MUL)208    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);209BENCHMARK_CAPTURE(BM_True_, Both_, genGlobAtBothSides)210    ->RangeMultiplier(MAX_LIST_MUL)211    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);212BENCHMARK_CAPTURE(BM_True_, Mix__, genGlobAtBothSidesAndMid)213    ->RangeMultiplier(MAX_LIST_MUL)214    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);215 216BENCHMARK_CAPTURE(BM_False, None_, genGlobNone)217    ->RangeMultiplier(MAX_LIST_MUL)218    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);219BENCHMARK_CAPTURE(BM_False, Start, genGlobAtStart)220    ->RangeMultiplier(MAX_LIST_MUL)221    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);222BENCHMARK_CAPTURE(BM_False, End__, genGlobAtEnd)223    ->RangeMultiplier(MAX_LIST_MUL)224    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);225BENCHMARK_CAPTURE(BM_False, Mid__, genGlobInMid)226    ->RangeMultiplier(MAX_LIST_MUL)227    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);228BENCHMARK_CAPTURE(BM_False, Both_, genGlobAtBothSides)229    ->RangeMultiplier(MAX_LIST_MUL)230    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);231BENCHMARK_CAPTURE(BM_False, Mix__, genGlobAtBothSidesAndMid)232    ->RangeMultiplier(MAX_LIST_MUL)233    ->Range(MAX_LIST_MIN, MAX_LIST_MAX);234 235BENCHMARK_MAIN();236