blob: 2cea3f69c6731b103795056716a3b0cec1035c6a [file] [log] [blame]
Eric Fiselier18d2fa32016-10-30 22:53:00 +00001#include <experimental/filesystem>
2
3#include "benchmark/benchmark_api.h"
4#include "GenerateInput.hpp"
5
6namespace fs = std::experimental::filesystem;
7
8static const size_t TestNumInputs = 1024;
9
10
11template <class GenInputs>
12void BM_PathConstructString(benchmark::State &st, GenInputs gen) {
13 using namespace fs;
14 const auto in = gen(st.range(0));
15 path PP;
16 for (auto& Part : in)
17 PP /= Part;
18 benchmark::DoNotOptimize(PP.native().data());
19 while (st.KeepRunning()) {
20 const path P(PP.native());
21 benchmark::DoNotOptimize(P.native().data());
22 }
23}
Eric Fiselier70027d62016-10-30 23:53:50 +000024BENCHMARK_CAPTURE(BM_PathConstructString, large_string,
Eric Fiselier18d2fa32016-10-30 22:53:00 +000025 getRandomStringInputs)->Arg(TestNumInputs);
26
27
28template <class GenInputs>
Eric Fiselier70027d62016-10-30 23:53:50 +000029void BM_PathConstructCStr(benchmark::State &st, GenInputs gen) {
30 using namespace fs;
31 const auto in = gen(st.range(0));
32 path PP;
33 for (auto& Part : in)
34 PP /= Part;
35 benchmark::DoNotOptimize(PP.native().data());
36 while (st.KeepRunning()) {
37 const path P(PP.native().c_str());
38 benchmark::DoNotOptimize(P.native().data());
39 }
40}
41BENCHMARK_CAPTURE(BM_PathConstructCStr, large_string,
42 getRandomStringInputs)->Arg(TestNumInputs);
43
44template <class GenInputs>
Eric Fiselier18d2fa32016-10-30 22:53:00 +000045void BM_PathIterateMultipleTimes(benchmark::State &st, GenInputs gen) {
46 using namespace fs;
47 const auto in = gen(st.range(0));
48 path PP;
49 for (auto& Part : in)
50 PP /= Part;
51 benchmark::DoNotOptimize(PP.native().data());
52 while (st.KeepRunning()) {
53 for (auto &E : PP) {
54 benchmark::DoNotOptimize(E.native().data());
55 }
56 benchmark::ClobberMemory();
57 }
58}
59BENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements,
60 getRandomStringInputs)->Arg(TestNumInputs);
61
62
63template <class GenInputs>
64void BM_PathIterateOnce(benchmark::State &st, GenInputs gen) {
65 using namespace fs;
66 const auto in = gen(st.range(0));
67 path PP;
68 for (auto& Part : in)
69 PP /= Part;
70 benchmark::DoNotOptimize(PP.native().data());
71 while (st.KeepRunning()) {
72 const path P = PP.native();
73 for (auto &E : P) {
74 benchmark::DoNotOptimize(E.native().data());
75 }
76 benchmark::ClobberMemory();
77 }
78}
79BENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements,
80 getRandomStringInputs)->Arg(TestNumInputs);
81
82template <class GenInputs>
83void BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) {
84 using namespace fs;
85 const auto in = gen(st.range(0));
86 path PP;
87 for (auto& Part : in)
88 PP /= Part;
89 benchmark::DoNotOptimize(PP.native().data());
90 while (st.KeepRunning()) {
91 const path P = PP.native();
92 const auto B = P.begin();
93 auto I = P.end();
94 while (I != B) {
95 --I;
96 benchmark::DoNotOptimize(*I);
97 }
98 benchmark::DoNotOptimize(*I);
99 }
100}
101BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements,
102 getRandomStringInputs)->Arg(TestNumInputs);
103
Eric Fiselier18d2fa32016-10-30 22:53:00 +0000104BENCHMARK_MAIN()