blob: f7949a163a7f1e0a6be7c21194f24316dc48d2a2 [file] [log] [blame]
Eric Fiselier2d2f0c02016-10-30 22:53:00 +00001#include <experimental/filesystem>
2
3#include "benchmark/benchmark_api.h"
4#include "GenerateInput.hpp"
Eric Fiselier026d38e2016-10-31 02:46:25 +00005#include "test_iterators.h"
Eric Fiselier2d2f0c02016-10-30 22:53:00 +00006
7namespace fs = std::experimental::filesystem;
8
9static const size_t TestNumInputs = 1024;
10
11
12template <class GenInputs>
13void 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}
Eric Fiselierad1a12c2016-10-30 23:53:50 +000025BENCHMARK_CAPTURE(BM_PathConstructString, large_string,
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000026 getRandomStringInputs)->Arg(TestNumInputs);
27
28
29template <class GenInputs>
Eric Fiselierad1a12c2016-10-30 23:53:50 +000030void 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}
42BENCHMARK_CAPTURE(BM_PathConstructCStr, large_string,
43 getRandomStringInputs)->Arg(TestNumInputs);
44
Eric Fiselier026d38e2016-10-31 02:46:25 +000045
46template <template <class...> class ItType, class GenInputs>
47void 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}
64template <class GenInputs>
65void BM_PathConstructInputIter(benchmark::State &st, GenInputs gen) {
66 BM_PathConstructIter<input_iterator>(st, gen);
67}
68template <class GenInputs>
69void BM_PathConstructForwardIter(benchmark::State &st, GenInputs gen) {
70 BM_PathConstructIter<forward_iterator>(st, gen);
71}
72BENCHMARK_CAPTURE(BM_PathConstructInputIter, large_string,
73 getRandomStringInputs)->Arg(TestNumInputs);
74BENCHMARK_CAPTURE(BM_PathConstructForwardIter, large_string,
75 getRandomStringInputs)->Arg(TestNumInputs);
76
77
Eric Fiselierad1a12c2016-10-30 23:53:50 +000078template <class GenInputs>
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000079void 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}
93BENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements,
94 getRandomStringInputs)->Arg(TestNumInputs);
95
96
97template <class GenInputs>
98void 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}
113BENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements,
114 getRandomStringInputs)->Arg(TestNumInputs);
115
116template <class GenInputs>
117void 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}
135BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements,
136 getRandomStringInputs)->Arg(TestNumInputs);
137
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000138BENCHMARK_MAIN()