filesystem.bench.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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, iterate_elements,
  20. getRandomStringInputs)->Arg(TestNumInputs);
  21. template <class GenInputs>
  22. void BM_PathIterateMultipleTimes(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. for (auto &E : PP) {
  31. benchmark::DoNotOptimize(E.native().data());
  32. }
  33. benchmark::ClobberMemory();
  34. }
  35. }
  36. BENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements,
  37. getRandomStringInputs)->Arg(TestNumInputs);
  38. template <class GenInputs>
  39. void BM_PathIterateOnce(benchmark::State &st, GenInputs gen) {
  40. using namespace fs;
  41. const auto in = gen(st.range(0));
  42. path PP;
  43. for (auto& Part : in)
  44. PP /= Part;
  45. benchmark::DoNotOptimize(PP.native().data());
  46. while (st.KeepRunning()) {
  47. const path P = PP.native();
  48. for (auto &E : P) {
  49. benchmark::DoNotOptimize(E.native().data());
  50. }
  51. benchmark::ClobberMemory();
  52. }
  53. }
  54. BENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements,
  55. getRandomStringInputs)->Arg(TestNumInputs);
  56. template <class GenInputs>
  57. void BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) {
  58. using namespace fs;
  59. const auto in = gen(st.range(0));
  60. path PP;
  61. for (auto& Part : in)
  62. PP /= Part;
  63. benchmark::DoNotOptimize(PP.native().data());
  64. while (st.KeepRunning()) {
  65. const path P = PP.native();
  66. const auto B = P.begin();
  67. auto I = P.end();
  68. while (I != B) {
  69. --I;
  70. benchmark::DoNotOptimize(*I);
  71. }
  72. benchmark::DoNotOptimize(*I);
  73. }
  74. }
  75. BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements,
  76. getRandomStringInputs)->Arg(TestNumInputs);
  77. BENCHMARK_MAIN()