12d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier#include <experimental/filesystem>
22d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier
3fd2e3e98c1decf5bc600b5962cbbbe8374b5cd3eEric Fiselier#include "benchmark/benchmark.h"
42d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier#include "GenerateInput.hpp"
5026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier#include "test_iterators.h"
62d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier
72d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliernamespace fs = std::experimental::filesystem;
82d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier
92d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselierstatic const size_t TestNumInputs = 1024;
102d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier
112d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier
122d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliertemplate <class GenInputs>
132d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliervoid BM_PathConstructString(benchmark::State &st, GenInputs gen) {
142d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  using namespace fs;
152d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  const auto in = gen(st.range(0));
162d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  path PP;
172d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  for (auto& Part : in)
182d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    PP /= Part;
192d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  benchmark::DoNotOptimize(PP.native().data());
202d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  while (st.KeepRunning()) {
212d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    const path P(PP.native());
222d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    benchmark::DoNotOptimize(P.native().data());
232d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  }
242d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier}
25ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric FiselierBENCHMARK_CAPTURE(BM_PathConstructString, large_string,
262d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  getRandomStringInputs)->Arg(TestNumInputs);
272d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier
282d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier
292d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliertemplate <class GenInputs>
30ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiseliervoid BM_PathConstructCStr(benchmark::State &st, GenInputs gen) {
31ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier  using namespace fs;
32ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier  const auto in = gen(st.range(0));
33ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier  path PP;
34ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier  for (auto& Part : in)
35ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier    PP /= Part;
36ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier  benchmark::DoNotOptimize(PP.native().data());
37ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier  while (st.KeepRunning()) {
38ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier    const path P(PP.native().c_str());
39ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier    benchmark::DoNotOptimize(P.native().data());
40ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier  }
41ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier}
42ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric FiselierBENCHMARK_CAPTURE(BM_PathConstructCStr, large_string,
43ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier  getRandomStringInputs)->Arg(TestNumInputs);
44ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier
45026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier
46026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliertemplate <template <class...> class ItType, class GenInputs>
47026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliervoid BM_PathConstructIter(benchmark::State &st, GenInputs gen) {
48026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  using namespace fs;
49026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  using Iter = ItType<std::string::const_iterator>;
50026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  const auto in = gen(st.range(0));
51026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  path PP;
52026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  for (auto& Part : in)
53026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier    PP /= Part;
54026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  auto Start = Iter(PP.native().begin());
55026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  auto End = Iter(PP.native().end());
56026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  benchmark::DoNotOptimize(PP.native().data());
57026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  benchmark::DoNotOptimize(Start);
58026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  benchmark::DoNotOptimize(End);
59026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  while (st.KeepRunning()) {
60026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier    const path P(Start, End);
61026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier    benchmark::DoNotOptimize(P.native().data());
62026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  }
63026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier}
64026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliertemplate <class GenInputs>
65026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliervoid BM_PathConstructInputIter(benchmark::State &st, GenInputs gen) {
66026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  BM_PathConstructIter<input_iterator>(st, gen);
67026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier}
68026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliertemplate <class GenInputs>
69026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliervoid BM_PathConstructForwardIter(benchmark::State &st, GenInputs gen) {
70026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  BM_PathConstructIter<forward_iterator>(st, gen);
71026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier}
72026d38e8fb58c114b7cabcdb5e00650368dfb681Eric FiselierBENCHMARK_CAPTURE(BM_PathConstructInputIter, large_string,
73026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  getRandomStringInputs)->Arg(TestNumInputs);
74026d38e8fb58c114b7cabcdb5e00650368dfb681Eric FiselierBENCHMARK_CAPTURE(BM_PathConstructForwardIter, large_string,
75026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier  getRandomStringInputs)->Arg(TestNumInputs);
76026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier
77026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier
78ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiseliertemplate <class GenInputs>
792d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliervoid BM_PathIterateMultipleTimes(benchmark::State &st, GenInputs gen) {
802d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  using namespace fs;
812d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  const auto in = gen(st.range(0));
822d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  path PP;
832d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  for (auto& Part : in)
842d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    PP /= Part;
852d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  benchmark::DoNotOptimize(PP.native().data());
862d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  while (st.KeepRunning()) {
872d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    for (auto &E : PP) {
882d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier      benchmark::DoNotOptimize(E.native().data());
892d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    }
902d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    benchmark::ClobberMemory();
912d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  }
922d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier}
932d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric FiselierBENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements,
942d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  getRandomStringInputs)->Arg(TestNumInputs);
952d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier
962d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier
972d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliertemplate <class GenInputs>
982d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliervoid BM_PathIterateOnce(benchmark::State &st, GenInputs gen) {
992d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  using namespace fs;
1002d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  const auto in = gen(st.range(0));
1012d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  path PP;
1022d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  for (auto& Part : in)
1032d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    PP /= Part;
1042d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  benchmark::DoNotOptimize(PP.native().data());
1052d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  while (st.KeepRunning()) {
1062d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    const path P = PP.native();
1072d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    for (auto &E : P) {
1082d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier      benchmark::DoNotOptimize(E.native().data());
1092d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    }
1102d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    benchmark::ClobberMemory();
1112d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  }
1122d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier}
1132d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric FiselierBENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements,
1142d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  getRandomStringInputs)->Arg(TestNumInputs);
1152d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier
1162d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliertemplate <class GenInputs>
1172d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliervoid BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) {
1182d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  using namespace fs;
1192d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  const auto in = gen(st.range(0));
1202d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  path PP;
1212d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  for (auto& Part : in)
1222d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    PP /= Part;
1232d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  benchmark::DoNotOptimize(PP.native().data());
1242d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  while (st.KeepRunning()) {
1252d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    const path P = PP.native();
1262d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    const auto B = P.begin();
1272d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    auto I = P.end();
1282d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    while (I != B) {
1292d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier      --I;
1302d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier      benchmark::DoNotOptimize(*I);
1312d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    }
1322d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier    benchmark::DoNotOptimize(*I);
1332d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  }
1342d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier}
1352d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric FiselierBENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements,
1362d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier  getRandomStringInputs)->Arg(TestNumInputs);
1372d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier
138fd2e3e98c1decf5bc600b5962cbbbe8374b5cd3eEric FiselierBENCHMARK_MAIN();
139