rx312

bench c++

Dec 16th, 2021
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.52 KB | None | 0 0
  1. #include <algorithm>
  2. #include <benchmark/benchmark.h>
  3. #include <random>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. int findMidMax(vector<int> &v, int begin, int end);
  9.  
  10. int solve(vector<int> &v, int begin, int end) {
  11. if (begin == end) {
  12. return 0;
  13. }
  14. if (begin + 1 == end) {
  15. return v[begin];
  16. }
  17.  
  18. int mid = (begin + end) / 2;
  19. int leftMax = solve(v, begin, mid);
  20. int rightMax = solve(v, mid, end);
  21. int midMax = findMidMax(v, begin, end);
  22.  
  23. return max(leftMax, max(rightMax, midMax));
  24. }
  25.  
  26. int findMidMax(vector<int> &v, int begin, int end) {
  27. int mid = (begin + end) / 2;
  28. int left = mid - 1;
  29. int right = mid;
  30. int minHeight = min(v[left], v[right]);
  31. int size = 2 * minHeight;
  32. while (begin < left || right + 1 < end) {
  33. if (begin < left && (right + 1 == end || v[left - 1] > v[right + 1])) {
  34. --left;
  35. minHeight = min(minHeight, v[left]);
  36. } else {
  37. ++right;
  38. minHeight = min(minHeight, v[right]);
  39. }
  40. size = max(size, minHeight * (right - left + 1));
  41. }
  42. return size;
  43. }
  44.  
  45. static void Solve(benchmark::State &state) {
  46. size_t size = state.range(0);
  47. std::mt19937 gen(12345);
  48. uniform_int_distribution dist(0, 65535);
  49. vector<int> s(size);
  50. generate(begin(s), end(s), [&] { return dist(gen); });
  51. for (auto _ : state) {
  52. int res = solve(s, 0, s.size());
  53. benchmark::DoNotOptimize(res);
  54. }
  55. }
  56.  
  57. BENCHMARK(Solve)
  58. ->Args({10})
  59. ->Args({100})
  60. ->Args({1000})
  61. ->Args({10000})
  62. ->Args({100000});
  63.  
  64. BENCHMARK_MAIN();
  65.  
Advertisement
Add Comment
Please, Sign In to add comment