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