filesystem.bench.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include <experimental/filesystem>
  2. #include "benchmark/benchmark_api.h"
  3. #include "GenerateInput.hpp"
  4. namespace fs = std::experimental::filesystem;
  5. static const size_t TestNumInputs = 1024;
  6. template <class GenInputs>
  7. void BM_PathConstructString(benchmark::State &st, GenInputs gen) {
  8. using namespace fs;
  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. }
  19. BENCHMARK_CAPTURE(BM_PathConstructString, large_string,
  20. getRandomStringInputs)->Arg(TestNumInputs);
  21. template <class GenInputs>
  22. void BM_PathConstructCStr(benchmark::State &st, GenInputs gen) {
  23. using namespace fs;
  24. const auto in = gen(st.range(0));
  25. path PP;
  26. for (auto& Part : in)
  27. PP /= Part;
  28. benchmark::DoNotOptimize(PP.native().data());
  29. while (st.KeepRunning()) {
  30. const path P(PP.native().c_str());
  31. benchmark::DoNotOptimize(P.native().data());
  32. }
  33. }
  34. BENCHMARK_CAPTURE(BM_PathConstructCStr, large_string,
  35. getRandomStringInputs)->Arg(TestNumInputs);
  36. template <class GenInputs>
  37. void BM_PathIterateMultipleTimes(benchmark::State &st, GenInputs gen) {
  38. using namespace fs;
  39. const auto in = gen(st.range(0));
  40. path PP;
  41. for (auto& Part : in)
  42. PP /= Part;
  43. benchmark::DoNotOptimize(PP.native().data());
  44. while (st.KeepRunning()) {
  45. for (auto &E : PP) {
  46. benchmark::DoNotOptimize(E.native().data());
  47. }
  48. benchmark::ClobberMemory();
  49. }
  50. }
  51. BENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements,
  52. getRandomStringInputs)->Arg(TestNumInputs);
  53. template <class GenInputs>
  54. void BM_PathIterateOnce(benchmark::State &st, GenInputs gen) {
  55. using namespace fs;
  56. const auto in = gen(st.range(0));
  57. path PP;
  58. for (auto& Part : in)
  59. PP /= Part;
  60. benchmark::DoNotOptimize(PP.native().data());
  61. while (st.KeepRunning()) {
  62. const path P = PP.native();
  63. for (auto &E : P) {
  64. benchmark::DoNotOptimize(E.native().data());
  65. }
  66. benchmark::ClobberMemory();
  67. }
  68. }
  69. BENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements,
  70. getRandomStringInputs)->Arg(TestNumInputs);
  71. template <class GenInputs>
  72. void BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) {
  73. using namespace fs;
  74. const auto in = gen(st.range(0));
  75. path PP;
  76. for (auto& Part : in)
  77. PP /= Part;
  78. benchmark::DoNotOptimize(PP.native().data());
  79. while (st.KeepRunning()) {
  80. const path P = PP.native();
  81. const auto B = P.begin();
  82. auto I = P.end();
  83. while (I != B) {
  84. --I;
  85. benchmark::DoNotOptimize(*I);
  86. }
  87. benchmark::DoNotOptimize(*I);
  88. }
  89. }
  90. BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements,
  91. getRandomStringInputs)->Arg(TestNumInputs);
  92. BENCHMARK_MAIN()