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