blob: 44200fb3cab08bd4a25d542a6698004be7631db9 [file] [log] [blame]
Nico Weberf9387552019-08-21 01:59:121#include "GenerateInput.h"
Louis Dionne5aa03b62023-06-16 13:49:042#include "benchmark/benchmark.h"
Nico Webercc890632019-08-21 00:14:123#include "filesystem_include.h"
Louis Dionne5aa03b62023-06-16 13:49:044#include "test_iterators.h"
Eric Fiselier3aa54782016-10-30 22:53:005
6static const size_t TestNumInputs = 1024;
7
Eric Fiselier3aa54782016-10-30 22:53:008template <class GenInputs>
Louis Dionne5aa03b62023-06-16 13:49:049void BM_PathConstructString(benchmark::State& st, GenInputs gen) {
Eric Fiselierd7fae182018-04-02 23:03:4110 using fs::path;
Eric Fiselier3aa54782016-10-30 22:53:0011 const auto in = gen(st.range(0));
12 path PP;
13 for (auto& Part : in)
14 PP /= Part;
15 benchmark::DoNotOptimize(PP.native().data());
16 while (st.KeepRunning()) {
17 const path P(PP.native());
18 benchmark::DoNotOptimize(P.native().data());
19 }
Eric Fiselierd7fae182018-04-02 23:03:4120 st.SetComplexityN(st.range(0));
Eric Fiselier3aa54782016-10-30 22:53:0021}
Louis Dionne5aa03b62023-06-16 13:49:0422BENCHMARK_CAPTURE(BM_PathConstructString, large_string, getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
Eric Fiselier3aa54782016-10-30 22:53:0023
24template <class GenInputs>
Louis Dionne5aa03b62023-06-16 13:49:0425void BM_PathConstructCStr(benchmark::State& st, GenInputs gen) {
Eric Fiselierd7fae182018-04-02 23:03:4126 using fs::path;
Eric Fiselieref915d32016-10-30 23:53:5027 const auto in = gen(st.range(0));
28 path PP;
29 for (auto& Part : in)
30 PP /= Part;
31 benchmark::DoNotOptimize(PP.native().data());
32 while (st.KeepRunning()) {
33 const path P(PP.native().c_str());
34 benchmark::DoNotOptimize(P.native().data());
35 }
36}
Louis Dionne5aa03b62023-06-16 13:49:0437BENCHMARK_CAPTURE(BM_PathConstructCStr, large_string, getRandomStringInputs)->Arg(TestNumInputs);
Eric Fiseliera5533302016-10-31 02:46:2538
39template <template <class...> class ItType, class GenInputs>
Louis Dionne5aa03b62023-06-16 13:49:0440void BM_PathConstructIter(benchmark::State& st, GenInputs gen) {
Eric Fiselierd7fae182018-04-02 23:03:4141 using fs::path;
Louis Dionne5aa03b62023-06-16 13:49:0442 using Iter = ItType<std::string::const_iterator>;
Eric Fiseliera5533302016-10-31 02:46:2543 const auto in = gen(st.range(0));
44 path PP;
45 for (auto& Part : in)
46 PP /= Part;
47 auto Start = Iter(PP.native().begin());
Louis Dionne5aa03b62023-06-16 13:49:0448 auto End = Iter(PP.native().end());
Eric Fiseliera5533302016-10-31 02:46:2549 benchmark::DoNotOptimize(PP.native().data());
50 benchmark::DoNotOptimize(Start);
51 benchmark::DoNotOptimize(End);
52 while (st.KeepRunning()) {
53 const path P(Start, End);
54 benchmark::DoNotOptimize(P.native().data());
55 }
Eric Fiselierd7fae182018-04-02 23:03:4156 st.SetComplexityN(st.range(0));
Eric Fiseliera5533302016-10-31 02:46:2557}
58template <class GenInputs>
Louis Dionne5aa03b62023-06-16 13:49:0459void BM_PathConstructInputIter(benchmark::State& st, GenInputs gen) {
Christopher Di Bella773ae442021-04-24 21:31:2360 BM_PathConstructIter<cpp17_input_iterator>(st, gen);
Eric Fiseliera5533302016-10-31 02:46:2561}
62template <class GenInputs>
Louis Dionne5aa03b62023-06-16 13:49:0463void BM_PathConstructForwardIter(benchmark::State& st, GenInputs gen) {
Eric Fiseliera5533302016-10-31 02:46:2564 BM_PathConstructIter<forward_iterator>(st, gen);
65}
Louis Dionne5aa03b62023-06-16 13:49:0466BENCHMARK_CAPTURE(BM_PathConstructInputIter, large_string, getRandomStringInputs)
67 ->Range(8, TestNumInputs)
68 ->Complexity();
69BENCHMARK_CAPTURE(BM_PathConstructForwardIter, large_string, getRandomStringInputs)
70 ->Range(8, TestNumInputs)
71 ->Complexity();
Eric Fiseliera5533302016-10-31 02:46:2572
Eric Fiselieref915d32016-10-30 23:53:5073template <class GenInputs>
Louis Dionne5aa03b62023-06-16 13:49:0474void BM_PathIterateMultipleTimes(benchmark::State& st, GenInputs gen) {
Eric Fiselierd7fae182018-04-02 23:03:4175 using fs::path;
Eric Fiselier3aa54782016-10-30 22:53:0076 const auto in = gen(st.range(0));
77 path PP;
78 for (auto& Part : in)
79 PP /= Part;
80 benchmark::DoNotOptimize(PP.native().data());
81 while (st.KeepRunning()) {
Louis Dionnea2afc822022-01-24 17:05:0982 for (auto const& E : PP) {
Eric Fiselier3aa54782016-10-30 22:53:0083 benchmark::DoNotOptimize(E.native().data());
84 }
85 benchmark::ClobberMemory();
86 }
Eric Fiselierd7fae182018-04-02 23:03:4187 st.SetComplexityN(st.range(0));
Eric Fiselier3aa54782016-10-30 22:53:0088}
Louis Dionne5aa03b62023-06-16 13:49:0489BENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements, getRandomStringInputs)
90 ->Range(8, TestNumInputs)
91 ->Complexity();
Eric Fiselier3aa54782016-10-30 22:53:0092
93template <class GenInputs>
Louis Dionne5aa03b62023-06-16 13:49:0494void BM_PathIterateOnce(benchmark::State& st, GenInputs gen) {
Eric Fiselierd7fae182018-04-02 23:03:4195 using fs::path;
Eric Fiselier3aa54782016-10-30 22:53:0096 const auto in = gen(st.range(0));
97 path PP;
98 for (auto& Part : in)
99 PP /= Part;
100 benchmark::DoNotOptimize(PP.native().data());
101 while (st.KeepRunning()) {
102 const path P = PP.native();
Louis Dionnea2afc822022-01-24 17:05:09103 for (auto const& E : P) {
Eric Fiselier3aa54782016-10-30 22:53:00104 benchmark::DoNotOptimize(E.native().data());
105 }
106 benchmark::ClobberMemory();
107 }
Eric Fiselierd7fae182018-04-02 23:03:41108 st.SetComplexityN(st.range(0));
Eric Fiselier3aa54782016-10-30 22:53:00109}
Louis Dionne5aa03b62023-06-16 13:49:04110BENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements, getRandomStringInputs)->Range(8, TestNumInputs)->Complexity();
Eric Fiselier3aa54782016-10-30 22:53:00111
112template <class GenInputs>
Louis Dionne5aa03b62023-06-16 13:49:04113void BM_PathIterateOnceBackwards(benchmark::State& st, GenInputs gen) {
Eric Fiselierd7fae182018-04-02 23:03:41114 using fs::path;
Eric Fiselier3aa54782016-10-30 22:53:00115 const auto in = gen(st.range(0));
116 path PP;
117 for (auto& Part : in)
118 PP /= Part;
119 benchmark::DoNotOptimize(PP.native().data());
120 while (st.KeepRunning()) {
121 const path P = PP.native();
122 const auto B = P.begin();
Louis Dionne5aa03b62023-06-16 13:49:04123 auto I = P.end();
Eric Fiselier3aa54782016-10-30 22:53:00124 while (I != B) {
125 --I;
126 benchmark::DoNotOptimize(*I);
127 }
128 benchmark::DoNotOptimize(*I);
129 }
130}
Louis Dionne5aa03b62023-06-16 13:49:04131BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements, getRandomStringInputs)->Arg(TestNumInputs);
Eric Fiselier3aa54782016-10-30 22:53:00132
Eric Fiselierd7fae182018-04-02 23:03:41133static fs::path getRandomPaths(int NumParts, int PathLen) {
134 fs::path Result;
135 while (NumParts--) {
136 std::string Part = getRandomString(PathLen);
137 Result /= Part;
138 }
139 return Result;
140}
141
142template <class GenInput>
Louis Dionne5aa03b62023-06-16 13:49:04143void BM_LexicallyNormal(benchmark::State& st, GenInput gen, size_t PathLen) {
Eric Fiselierd7fae182018-04-02 23:03:41144 using fs::path;
145 auto In = gen(st.range(0), PathLen);
146 benchmark::DoNotOptimize(&In);
147 while (st.KeepRunning()) {
148 benchmark::DoNotOptimize(In.lexically_normal());
149 }
150 st.SetComplexityN(st.range(0));
151}
Louis Dionne5aa03b62023-06-16 13:49:04152BENCHMARK_CAPTURE(BM_LexicallyNormal, small_path, getRandomPaths, /*PathLen*/ 5)
153 ->RangeMultiplier(2)
154 ->Range(2, 256)
155 ->Complexity();
156BENCHMARK_CAPTURE(BM_LexicallyNormal, large_path, getRandomPaths, /*PathLen*/ 32)
157 ->RangeMultiplier(2)
158 ->Range(2, 256)
159 ->Complexity();
Eric Fiselierd7fae182018-04-02 23:03:41160
Eric Fiselier19039762018-01-18 04:23:01161BENCHMARK_MAIN();