71 lines
2.1 KiB
C++
71 lines
2.1 KiB
C++
#include <celero/Celero.h>
|
|
#include <alsk/alsk.h>
|
|
|
|
#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<int(), FN(rand)>();
|
|
constexpr auto lTask = link<Data(P<0>, P<1>)>(eTask);
|
|
constexpr auto eSerial = link<R<4>(int, int)>(lTask & lTask & link<Data(R<0>, R<1>)>(eSelect) & eRand & link<Value(R<2>, R<3>)>(eProject));
|
|
|
|
constexpr auto eRandStdFun = makeOperand<int(), std::function<int()>>();
|
|
constexpr auto lTaskStdFun = link<Data(P<0>, P<1>)>(eTaskStdFun);
|
|
constexpr auto eSerialStdFun = link<R<4>(int, int)>(
|
|
lTaskStdFun & lTaskStdFun & link<Data(R<0>, R<1>)>(eSelectStdFun) &
|
|
eRandStdFun & link<Value(R<2>, 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<alsk::exec::Sequential>(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<alsk::exec::Sequential>(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)
|
|
);
|
|
}
|