12d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier#include <experimental/filesystem> 22d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier 3fd2e3e98c1decf5bc600b5962cbbbe8374b5cd3eEric Fiselier#include "benchmark/benchmark.h" 42d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier#include "GenerateInput.hpp" 5026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier#include "test_iterators.h" 62d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier 72d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliernamespace fs = std::experimental::filesystem; 82d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier 92d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselierstatic const size_t TestNumInputs = 1024; 102d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier 112d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier 122d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliertemplate <class GenInputs> 132d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliervoid BM_PathConstructString(benchmark::State &st, GenInputs gen) { 142d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier using namespace fs; 152d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier const auto in = gen(st.range(0)); 162d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier path PP; 172d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier for (auto& Part : in) 182d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier PP /= Part; 192d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier benchmark::DoNotOptimize(PP.native().data()); 202d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier while (st.KeepRunning()) { 212d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier const path P(PP.native()); 222d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier benchmark::DoNotOptimize(P.native().data()); 232d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier } 242d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier} 25ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric FiselierBENCHMARK_CAPTURE(BM_PathConstructString, large_string, 262d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier getRandomStringInputs)->Arg(TestNumInputs); 272d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier 282d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier 292d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliertemplate <class GenInputs> 30ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiseliervoid BM_PathConstructCStr(benchmark::State &st, GenInputs gen) { 31ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier using namespace fs; 32ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier const auto in = gen(st.range(0)); 33ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier path PP; 34ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier for (auto& Part : in) 35ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier PP /= Part; 36ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier benchmark::DoNotOptimize(PP.native().data()); 37ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier while (st.KeepRunning()) { 38ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier const path P(PP.native().c_str()); 39ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier benchmark::DoNotOptimize(P.native().data()); 40ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier } 41ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier} 42ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric FiselierBENCHMARK_CAPTURE(BM_PathConstructCStr, large_string, 43ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier getRandomStringInputs)->Arg(TestNumInputs); 44ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiselier 45026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier 46026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliertemplate <template <class...> class ItType, class GenInputs> 47026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliervoid BM_PathConstructIter(benchmark::State &st, GenInputs gen) { 48026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier using namespace fs; 49026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier using Iter = ItType<std::string::const_iterator>; 50026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier const auto in = gen(st.range(0)); 51026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier path PP; 52026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier for (auto& Part : in) 53026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier PP /= Part; 54026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier auto Start = Iter(PP.native().begin()); 55026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier auto End = Iter(PP.native().end()); 56026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier benchmark::DoNotOptimize(PP.native().data()); 57026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier benchmark::DoNotOptimize(Start); 58026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier benchmark::DoNotOptimize(End); 59026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier while (st.KeepRunning()) { 60026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier const path P(Start, End); 61026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier benchmark::DoNotOptimize(P.native().data()); 62026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier } 63026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier} 64026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliertemplate <class GenInputs> 65026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliervoid BM_PathConstructInputIter(benchmark::State &st, GenInputs gen) { 66026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier BM_PathConstructIter<input_iterator>(st, gen); 67026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier} 68026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliertemplate <class GenInputs> 69026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiseliervoid BM_PathConstructForwardIter(benchmark::State &st, GenInputs gen) { 70026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier BM_PathConstructIter<forward_iterator>(st, gen); 71026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier} 72026d38e8fb58c114b7cabcdb5e00650368dfb681Eric FiselierBENCHMARK_CAPTURE(BM_PathConstructInputIter, large_string, 73026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier getRandomStringInputs)->Arg(TestNumInputs); 74026d38e8fb58c114b7cabcdb5e00650368dfb681Eric FiselierBENCHMARK_CAPTURE(BM_PathConstructForwardIter, large_string, 75026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier getRandomStringInputs)->Arg(TestNumInputs); 76026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier 77026d38e8fb58c114b7cabcdb5e00650368dfb681Eric Fiselier 78ad1a12c31216780fac34e5b267fa9b885d77d9f1Eric Fiseliertemplate <class GenInputs> 792d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliervoid BM_PathIterateMultipleTimes(benchmark::State &st, GenInputs gen) { 802d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier using namespace fs; 812d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier const auto in = gen(st.range(0)); 822d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier path PP; 832d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier for (auto& Part : in) 842d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier PP /= Part; 852d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier benchmark::DoNotOptimize(PP.native().data()); 862d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier while (st.KeepRunning()) { 872d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier for (auto &E : PP) { 882d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier benchmark::DoNotOptimize(E.native().data()); 892d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier } 902d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier benchmark::ClobberMemory(); 912d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier } 922d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier} 932d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric FiselierBENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements, 942d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier getRandomStringInputs)->Arg(TestNumInputs); 952d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier 962d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier 972d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliertemplate <class GenInputs> 982d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliervoid BM_PathIterateOnce(benchmark::State &st, GenInputs gen) { 992d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier using namespace fs; 1002d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier const auto in = gen(st.range(0)); 1012d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier path PP; 1022d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier for (auto& Part : in) 1032d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier PP /= Part; 1042d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier benchmark::DoNotOptimize(PP.native().data()); 1052d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier while (st.KeepRunning()) { 1062d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier const path P = PP.native(); 1072d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier for (auto &E : P) { 1082d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier benchmark::DoNotOptimize(E.native().data()); 1092d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier } 1102d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier benchmark::ClobberMemory(); 1112d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier } 1122d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier} 1132d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric FiselierBENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements, 1142d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier getRandomStringInputs)->Arg(TestNumInputs); 1152d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier 1162d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliertemplate <class GenInputs> 1172d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiseliervoid BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) { 1182d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier using namespace fs; 1192d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier const auto in = gen(st.range(0)); 1202d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier path PP; 1212d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier for (auto& Part : in) 1222d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier PP /= Part; 1232d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier benchmark::DoNotOptimize(PP.native().data()); 1242d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier while (st.KeepRunning()) { 1252d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier const path P = PP.native(); 1262d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier const auto B = P.begin(); 1272d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier auto I = P.end(); 1282d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier while (I != B) { 1292d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier --I; 1302d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier benchmark::DoNotOptimize(*I); 1312d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier } 1322d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier benchmark::DoNotOptimize(*I); 1332d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier } 1342d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier} 1352d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric FiselierBENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements, 1362d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier getRandomStringInputs)->Arg(TestNumInputs); 1372d2f0c0af37aaebeece1cdd37160f07d573ac6b8Eric Fiselier 138fd2e3e98c1decf5bc600b5962cbbbe8374b5cd3eEric FiselierBENCHMARK_MAIN(); 139