filesystem.bench.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include <experimental/filesystem>
  2. #include "benchmark/benchmark_api.h"
  3. #include "GenerateInput.hpp"
  4. #include "test_iterators.h"
  5. namespace fs = std::experimental::filesystem;
  6. static const size_t TestNumInputs = 1024;
  7. template <class GenInputs>
  8. void BM_PathConstructString(benchmark::State &st, GenInputs gen) {
  9. using namespace fs;
  10. const auto in = gen(st.range(0));
  11. path PP;
  12. for (auto& Part : in)
  13. PP /= Part;
  14. benchmark::DoNotOptimize(PP.native().data());
  15. while (st.KeepRunning()) {
  16. const path P(PP.native());
  17. benchmark::DoNotOptimize(P.native().data());
  18. }
  19. }
  20. BENCHMARK_CAPTURE(BM_PathConstructString, large_string,
  21. getRandomStringInputs)->Arg(TestNumInputs);
  22. template <class GenInputs>
  23. void BM_PathConstructCStr(benchmark::State &st, GenInputs gen) {
  24. using namespace fs;
  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 namespace fs;
  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. }
  55. template <class GenInputs>
  56. void BM_PathConstructInputIter(benchmark::State &st, GenInputs gen) {
  57. BM_PathConstructIter<input_iterator>(st, gen);
  58. }
  59. template <class GenInputs>
  60. void BM_PathConstructForwardIter(benchmark::State &st, GenInputs gen) {
  61. BM_PathConstructIter<forward_iterator>(st, gen);
  62. }
  63. BENCHMARK_CAPTURE(BM_PathConstructInputIter, large_string,
  64. getRandomStringInputs)->Arg(TestNumInputs);
  65. BENCHMARK_CAPTURE(BM_PathConstructForwardIter, large_string,
  66. getRandomStringInputs)->Arg(TestNumInputs);
  67. template <class GenInputs>
  68. void BM_PathIterateMultipleTimes(benchmark::State &st, GenInputs gen) {
  69. using namespace fs;
  70. const auto in = gen(st.range(0));
  71. path PP;
  72. for (auto& Part : in)
  73. PP /= Part;
  74. benchmark::DoNotOptimize(PP.native().data());
  75. while (st.KeepRunning()) {
  76. for (auto &E : PP) {
  77. benchmark::DoNotOptimize(E.native().data());
  78. }
  79. benchmark::ClobberMemory();
  80. }
  81. }
  82. BENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements,
  83. getRandomStringInputs)->Arg(TestNumInputs);
  84. template <class GenInputs>
  85. void BM_PathIterateOnce(benchmark::State &st, GenInputs gen) {
  86. using namespace fs;
  87. const auto in = gen(st.range(0));
  88. path PP;
  89. for (auto& Part : in)
  90. PP /= Part;
  91. benchmark::DoNotOptimize(PP.native().data());
  92. while (st.KeepRunning()) {
  93. const path P = PP.native();
  94. for (auto &E : P) {
  95. benchmark::DoNotOptimize(E.native().data());
  96. }
  97. benchmark::ClobberMemory();
  98. }
  99. }
  100. BENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements,
  101. getRandomStringInputs)->Arg(TestNumInputs);
  102. template <class GenInputs>
  103. void BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) {
  104. using namespace fs;
  105. const auto in = gen(st.range(0));
  106. path PP;
  107. for (auto& Part : in)
  108. PP /= Part;
  109. benchmark::DoNotOptimize(PP.native().data());
  110. while (st.KeepRunning()) {
  111. const path P = PP.native();
  112. const auto B = P.begin();
  113. auto I = P.end();
  114. while (I != B) {
  115. --I;
  116. benchmark::DoNotOptimize(*I);
  117. }
  118. benchmark::DoNotOptimize(*I);
  119. }
  120. }
  121. BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements,
  122. getRandomStringInputs)->Arg(TestNumInputs);
  123. BENCHMARK_MAIN()