blob: 8dacbe6644e615ea83be5ef0e4167966c03083ae [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}
24BENCHMARK_CAPTURE(BM_PathConstructString, iterate_elements,
25 getRandomStringInputs)->Arg(TestNumInputs);
26
27
28template <class GenInputs>
29void BM_PathIterateMultipleTimes(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 for (auto &E : PP) {
38 benchmark::DoNotOptimize(E.native().data());
39 }
40 benchmark::ClobberMemory();
41 }
42}
43BENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements,
44 getRandomStringInputs)->Arg(TestNumInputs);
45
46
47template <class GenInputs>
48void BM_PathIterateOnce(benchmark::State &st, GenInputs gen) {
49 using namespace fs;
50 const auto in = gen(st.range(0));
51 path PP;
52 for (auto& Part : in)
53 PP /= Part;
54 benchmark::DoNotOptimize(PP.native().data());
55 while (st.KeepRunning()) {
56 const path P = PP.native();
57 for (auto &E : P) {
58 benchmark::DoNotOptimize(E.native().data());
59 }
60 benchmark::ClobberMemory();
61 }
62}
63BENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements,
64 getRandomStringInputs)->Arg(TestNumInputs);
65
66template <class GenInputs>
67void BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) {
68 using namespace fs;
69 const auto in = gen(st.range(0));
70 path PP;
71 for (auto& Part : in)
72 PP /= Part;
73 benchmark::DoNotOptimize(PP.native().data());
74 while (st.KeepRunning()) {
75 const path P = PP.native();
76 const auto B = P.begin();
77 auto I = P.end();
78 while (I != B) {
79 --I;
80 benchmark::DoNotOptimize(*I);
81 }
82 benchmark::DoNotOptimize(*I);
83 }
84}
85BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements,
86 getRandomStringInputs)->Arg(TestNumInputs);
87
88
89
90BENCHMARK_MAIN()