blob: 3e4956059151a851bea004651640898d8feffab6 [file] [log] [blame]
Eric Fiselierfd2e3e92018-01-18 04:23:01 +00001#include "benchmark/benchmark.h"
Eric Fiselier2d2f0c02016-10-30 22:53:00 +00002#include "GenerateInput.hpp"
Eric Fiselier026d38e2016-10-31 02:46:25 +00003#include "test_iterators.h"
Eric Fiselier1e34c762018-04-02 23:03:41 +00004#include "filesystem_include.hpp"
Eric Fiselier2d2f0c02016-10-30 22:53:00 +00005
6static const size_t TestNumInputs = 1024;
7
8
9template <class GenInputs>
10void BM_PathConstructString(benchmark::State &st, GenInputs gen) {
Eric Fiselier1e34c762018-04-02 23:03:41 +000011 using fs::path;
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000012 const auto in = gen(st.range(0));
13 path PP;
14 for (auto& Part : in)
15 PP /= Part;
16 benchmark::DoNotOptimize(PP.native().data());
17 while (st.KeepRunning()) {
18 const path P(PP.native());
19 benchmark::DoNotOptimize(P.native().data());
20 }
Eric Fiselier1e34c762018-04-02 23:03:41 +000021 st.SetComplexityN(st.range(0));
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000022}
Eric Fiselierad1a12c2016-10-30 23:53:50 +000023BENCHMARK_CAPTURE(BM_PathConstructString, large_string,
Eric Fiselier1e34c762018-04-02 23:03:41 +000024 getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000025
26
27template <class GenInputs>
Eric Fiselierad1a12c2016-10-30 23:53:50 +000028void BM_PathConstructCStr(benchmark::State &st, GenInputs gen) {
Eric Fiselier1e34c762018-04-02 23:03:41 +000029 using fs::path;
Eric Fiselierad1a12c2016-10-30 23:53:50 +000030 const auto in = gen(st.range(0));
31 path PP;
32 for (auto& Part : in)
33 PP /= Part;
34 benchmark::DoNotOptimize(PP.native().data());
35 while (st.KeepRunning()) {
36 const path P(PP.native().c_str());
37 benchmark::DoNotOptimize(P.native().data());
38 }
39}
40BENCHMARK_CAPTURE(BM_PathConstructCStr, large_string,
41 getRandomStringInputs)->Arg(TestNumInputs);
42
Eric Fiselier026d38e2016-10-31 02:46:25 +000043
44template <template <class...> class ItType, class GenInputs>
45void BM_PathConstructIter(benchmark::State &st, GenInputs gen) {
Eric Fiselier1e34c762018-04-02 23:03:41 +000046 using fs::path;
Eric Fiselier026d38e2016-10-31 02:46:25 +000047 using Iter = ItType<std::string::const_iterator>;
48 const auto in = gen(st.range(0));
49 path PP;
50 for (auto& Part : in)
51 PP /= Part;
52 auto Start = Iter(PP.native().begin());
53 auto End = Iter(PP.native().end());
54 benchmark::DoNotOptimize(PP.native().data());
55 benchmark::DoNotOptimize(Start);
56 benchmark::DoNotOptimize(End);
57 while (st.KeepRunning()) {
58 const path P(Start, End);
59 benchmark::DoNotOptimize(P.native().data());
60 }
Eric Fiselier1e34c762018-04-02 23:03:41 +000061 st.SetComplexityN(st.range(0));
Eric Fiselier026d38e2016-10-31 02:46:25 +000062}
63template <class GenInputs>
64void BM_PathConstructInputIter(benchmark::State &st, GenInputs gen) {
65 BM_PathConstructIter<input_iterator>(st, gen);
66}
67template <class GenInputs>
68void BM_PathConstructForwardIter(benchmark::State &st, GenInputs gen) {
69 BM_PathConstructIter<forward_iterator>(st, gen);
70}
71BENCHMARK_CAPTURE(BM_PathConstructInputIter, large_string,
Eric Fiselier1e34c762018-04-02 23:03:41 +000072 getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
Eric Fiselier026d38e2016-10-31 02:46:25 +000073BENCHMARK_CAPTURE(BM_PathConstructForwardIter, large_string,
Eric Fiselier1e34c762018-04-02 23:03:41 +000074 getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
Eric Fiselier026d38e2016-10-31 02:46:25 +000075
76
Eric Fiselierad1a12c2016-10-30 23:53:50 +000077template <class GenInputs>
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000078void BM_PathIterateMultipleTimes(benchmark::State &st, GenInputs gen) {
Eric Fiselier1e34c762018-04-02 23:03:41 +000079 using fs::path;
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000080 const auto in = gen(st.range(0));
81 path PP;
82 for (auto& Part : in)
83 PP /= Part;
84 benchmark::DoNotOptimize(PP.native().data());
85 while (st.KeepRunning()) {
86 for (auto &E : PP) {
87 benchmark::DoNotOptimize(E.native().data());
88 }
89 benchmark::ClobberMemory();
90 }
Eric Fiselier1e34c762018-04-02 23:03:41 +000091 st.SetComplexityN(st.range(0));
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000092}
93BENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements,
Eric Fiselier1e34c762018-04-02 23:03:41 +000094 getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000095
96
97template <class GenInputs>
98void BM_PathIterateOnce(benchmark::State &st, GenInputs gen) {
Eric Fiselier1e34c762018-04-02 23:03:41 +000099 using fs::path;
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000100 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 }
Eric Fiselier1e34c762018-04-02 23:03:41 +0000112 st.SetComplexityN(st.range(0));
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000113}
114BENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements,
Eric Fiselier1e34c762018-04-02 23:03:41 +0000115 getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000116
117template <class GenInputs>
118void BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) {
Eric Fiselier1e34c762018-04-02 23:03:41 +0000119 using fs::path;
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000120 const auto in = gen(st.range(0));
121 path PP;
122 for (auto& Part : in)
123 PP /= Part;
124 benchmark::DoNotOptimize(PP.native().data());
125 while (st.KeepRunning()) {
126 const path P = PP.native();
127 const auto B = P.begin();
128 auto I = P.end();
129 while (I != B) {
130 --I;
131 benchmark::DoNotOptimize(*I);
132 }
133 benchmark::DoNotOptimize(*I);
134 }
135}
136BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements,
137 getRandomStringInputs)->Arg(TestNumInputs);
138
Eric Fiselier1e34c762018-04-02 23:03:41 +0000139static fs::path getRandomPaths(int NumParts, int PathLen) {
140 fs::path Result;
141 while (NumParts--) {
142 std::string Part = getRandomString(PathLen);
143 Result /= Part;
144 }
145 return Result;
146}
147
148template <class GenInput>
149void BM_LexicallyNormal(benchmark::State &st, GenInput gen, size_t PathLen) {
150 using fs::path;
151 auto In = gen(st.range(0), PathLen);
152 benchmark::DoNotOptimize(&In);
153 while (st.KeepRunning()) {
154 benchmark::DoNotOptimize(In.lexically_normal());
155 }
156 st.SetComplexityN(st.range(0));
157}
158BENCHMARK_CAPTURE(BM_LexicallyNormal, small_path,
159 getRandomPaths, /*PathLen*/5)->RangeMultiplier(2)->Range(2, 256)->Complexity();
160BENCHMARK_CAPTURE(BM_LexicallyNormal, large_path,
161 getRandomPaths, /*PathLen*/32)->RangeMultiplier(2)->Range(2, 256)->Complexity();
162
Eric Fiselierfd2e3e92018-01-18 04:23:01 +0000163BENCHMARK_MAIN();