filesystem.bench.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "benchmark/benchmark.h"
  2. #include "GenerateInput.hpp"
  3. #include "test_iterators.h"
  4. #include "filesystem_include.h"
  5. static const size_t TestNumInputs = 1024;
  6. template <class GenInputs>
  7. void BM_PathConstructString(benchmark::State &st, GenInputs gen) {
  8. using fs::path;
  9. const auto in = gen(st.range(0));
  10. path PP;
  11. for (auto& Part : in)
  12. PP /= Part;
  13. benchmark::DoNotOptimize(PP.native().data());
  14. while (st.KeepRunning()) {
  15. const path P(PP.native());
  16. benchmark::DoNotOptimize(P.native().data());
  17. }
  18. st.SetComplexityN(st.range(0));
  19. }
  20. BENCHMARK_CAPTURE(BM_PathConstructString, large_string,
  21. getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
  22. template <class GenInputs>
  23. void BM_PathConstructCStr(benchmark::State &st, GenInputs gen) {
  24. using fs::path;
  25. const auto in = gen(st.range(0));
  26. path PP;
  27. for (auto& Part : in)
  28. PP /= Part;
  29. benchmark::DoNotOptimize(PP.native().data());
  30. while (st.KeepRunning()) {
  31. const path P(PP.native().c_str());
  32. benchmark::DoNotOptimize(P.native().data());
  33. }
  34. }
  35. BENCHMARK_CAPTURE(BM_PathConstructCStr, large_string,
  36. getRandomStringInputs)->Arg(TestNumInputs);
  37. template <template <class...> class ItType, class GenInputs>
  38. void BM_PathConstructIter(benchmark::State &st, GenInputs gen) {
  39. using fs::path;
  40. using Iter = ItType<std::string::const_iterator>;
  41. const auto in = gen(st.range(0));
  42. path PP;
  43. for (auto& Part : in)
  44. PP /= Part;
  45. auto Start = Iter(PP.native().begin());
  46. auto End = Iter(PP.native().end());
  47. benchmark::DoNotOptimize(PP.native().data());
  48. benchmark::DoNotOptimize(Start);
  49. benchmark::DoNotOptimize(End);
  50. while (st.KeepRunning()) {
  51. const path P(Start, End);
  52. benchmark::DoNotOptimize(P.native().data());
  53. }
  54. st.SetComplexityN(st.range(0));
  55. }
  56. template <class GenInputs>
  57. void BM_PathConstructInputIter(benchmark::State &st, GenInputs gen) {
  58. BM_PathConstructIter<input_iterator>(st, gen);
  59. }
  60. template <class GenInputs>
  61. void BM_PathConstructForwardIter(benchmark::State &st, GenInputs gen) {
  62. BM_PathConstructIter<forward_iterator>(st, gen);
  63. }
  64. BENCHMARK_CAPTURE(BM_PathConstructInputIter, large_string,
  65. getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
  66. BENCHMARK_CAPTURE(BM_PathConstructForwardIter, large_string,
  67. getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
  68. template <class GenInputs>
  69. void BM_PathIterateMultipleTimes(benchmark::State &st, GenInputs gen) {
  70. using fs::path;
  71. const auto in = gen(st.range(0));
  72. path PP;
  73. for (auto& Part : in)
  74. PP /= Part;
  75. benchmark::DoNotOptimize(PP.native().data());
  76. while (st.KeepRunning()) {
  77. for (auto &E : PP) {
  78. benchmark::DoNotOptimize(E.native().data());
  79. }
  80. benchmark::ClobberMemory();
  81. }
  82. st.SetComplexityN(st.range(0));
  83. }
  84. BENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements,
  85. getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
  86. template <class GenInputs>
  87. void BM_PathIterateOnce(benchmark::State &st, GenInputs gen) {
  88. using fs::path;
  89. const auto in = gen(st.range(0));
  90. path PP;
  91. for (auto& Part : in)
  92. PP /= Part;
  93. benchmark::DoNotOptimize(PP.native().data());
  94. while (st.KeepRunning()) {
  95. const path P = PP.native();
  96. for (auto &E : P) {
  97. benchmark::DoNotOptimize(E.native().data());
  98. }
  99. benchmark::ClobberMemory();
  100. }
  101. st.SetComplexityN(st.range(0));
  102. }
  103. BENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements,
  104. getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
  105. template <class GenInputs>
  106. void BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) {
  107. using fs::path;
  108. const auto in = gen(st.range(0));
  109. path PP;
  110. for (auto& Part : in)
  111. PP /= Part;
  112. benchmark::DoNotOptimize(PP.native().data());
  113. while (st.KeepRunning()) {
  114. const path P = PP.native();
  115. const auto B = P.begin();
  116. auto I = P.end();
  117. while (I != B) {
  118. --I;
  119. benchmark::DoNotOptimize(*I);
  120. }
  121. benchmark::DoNotOptimize(*I);
  122. }
  123. }
  124. BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements,
  125. getRandomStringInputs)->Arg(TestNumInputs);
  126. static fs::path getRandomPaths(int NumParts, int PathLen) {
  127. fs::path Result;
  128. while (NumParts--) {
  129. std::string Part = getRandomString(PathLen);
  130. Result /= Part;
  131. }
  132. return Result;
  133. }
  134. template <class GenInput>
  135. void BM_LexicallyNormal(benchmark::State &st, GenInput gen, size_t PathLen) {
  136. using fs::path;
  137. auto In = gen(st.range(0), PathLen);
  138. benchmark::DoNotOptimize(&In);
  139. while (st.KeepRunning()) {
  140. benchmark::DoNotOptimize(In.lexically_normal());
  141. }
  142. st.SetComplexityN(st.range(0));
  143. }
  144. BENCHMARK_CAPTURE(BM_LexicallyNormal, small_path,
  145. getRandomPaths, /*PathLen*/5)->RangeMultiplier(2)->Range(2, 256)->Complexity();
  146. BENCHMARK_CAPTURE(BM_LexicallyNormal, large_path,
  147. getRandomPaths, /*PathLen*/32)->RangeMultiplier(2)->Range(2, 256)->Complexity();
  148. BENCHMARK_MAIN();