#include #include #include "common.h" using namespace bench; using namespace alsk::arg; using namespace alsk::edsl; constexpr unsigned samples = 50, iterations = 100; constexpr std::size_t vecSize = 100'000; constexpr int minValue = -250, maxValue = +250; decltype(auto) hwSerial(int min, int max) { Task task0{vecSize}, task1{vecSize}; Data v0 = task0(min, max), v1 = task1(min, max); Data const& v = select(v0, v1); return project(v, rand()); } decltype(auto) hwSerialBad(int min, int max) { Task task0{vecSize}, task1{vecSize}; Data v2 = select(task0(min, max), task1(min, max)); return project(v2, rand()); } constexpr auto eRand = makeOperand(); constexpr auto lTask = link, P<1>)>(eTask); constexpr auto eSerial = link(int, int)>(lTask & lTask & link, R<1>)>(eSelect) & eRand & link, R<3>)>(eProject)); constexpr auto eRandStdFun = makeOperand>(); constexpr auto lTaskStdFun = link, P<1>)>(eTaskStdFun); constexpr auto eSerialStdFun = link(int, int)>( lTaskStdFun & lTaskStdFun & link, R<1>)>(eSelectStdFun) & eRandStdFun & link, R<3>)>(eProjectStdFun)); BASELINE(Serial, Handwritten, samples, iterations) { celero::DoNotOptimizeAway( hwSerial(minValue, maxValue) ); } BENCHMARK(Serial, HandwrittenBad, samples, iterations) { celero::DoNotOptimizeAway( hwSerialBad(minValue, maxValue) ); } BENCHMARK(Serial, Skeleton, samples, iterations) { auto serial = alsk::edsl::implement(eSerial); serial.skeleton.task<0>().size = vecSize; serial.skeleton.task<1>().size = vecSize; celero::DoNotOptimizeAway( serial(minValue, maxValue) ); } BENCHMARK(Serial, SkeletonStdFunction, samples, iterations) { auto serial = alsk::edsl::implement(eSerialStdFun); serial.skeleton.task<0>() = Task{vecSize}; serial.skeleton.task<1>() = Task{vecSize}; serial.skeleton.task<2>() = bench::select; serial.skeleton.task<3>() = rand; serial.skeleton.task<4>() = project; celero::DoNotOptimizeAway( serial(minValue, maxValue) ); }