string.bench.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include <unordered_set>
  2. #include <vector>
  3. #include <cstdint>
  4. #include "benchmark/benchmark_api.h"
  5. #include "GenerateInput.hpp"
  6. constexpr std::size_t MAX_STRING_LEN = 8 << 14;
  7. // Benchmark when there is no match.
  8. static void BM_StringFindNoMatch(benchmark::State &state) {
  9. std::string s1(state.range(0), '-');
  10. std::string s2(8, '*');
  11. while (state.KeepRunning())
  12. benchmark::DoNotOptimize(s1.find(s2));
  13. }
  14. BENCHMARK(BM_StringFindNoMatch)->Range(10, MAX_STRING_LEN);
  15. // Benchmark when the string matches first time.
  16. static void BM_StringFindAllMatch(benchmark::State &state) {
  17. std::string s1(MAX_STRING_LEN, '-');
  18. std::string s2(state.range(0), '-');
  19. while (state.KeepRunning())
  20. benchmark::DoNotOptimize(s1.find(s2));
  21. }
  22. BENCHMARK(BM_StringFindAllMatch)->Range(1, MAX_STRING_LEN);
  23. // Benchmark when the string matches somewhere in the end.
  24. static void BM_StringFindMatch1(benchmark::State &state) {
  25. std::string s1(MAX_STRING_LEN / 2, '*');
  26. s1 += std::string(state.range(0), '-');
  27. std::string s2(state.range(0), '-');
  28. while (state.KeepRunning())
  29. benchmark::DoNotOptimize(s1.find(s2));
  30. }
  31. BENCHMARK(BM_StringFindMatch1)->Range(1, MAX_STRING_LEN / 4);
  32. // Benchmark when the string matches somewhere from middle to the end.
  33. static void BM_StringFindMatch2(benchmark::State &state) {
  34. std::string s1(MAX_STRING_LEN / 2, '*');
  35. s1 += std::string(state.range(0), '-');
  36. s1 += std::string(state.range(0), '*');
  37. std::string s2(state.range(0), '-');
  38. while (state.KeepRunning())
  39. benchmark::DoNotOptimize(s1.find(s2));
  40. }
  41. BENCHMARK(BM_StringFindMatch2)->Range(1, MAX_STRING_LEN / 4);
  42. BENCHMARK_MAIN()