alsk/celero/bone/itersel.cpp

51 lines
1.3 KiB
C++

#include <celero/Celero.h>
#include <alsk/alsk.h>
#include "common.h"
using namespace bench;
using namespace alsk::edsl;
using namespace alsk::arg;
constexpr unsigned samples = 50, iterations = 100;
constexpr unsigned n = 8192; // if too small => bad results
constexpr auto initVector = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
decltype(auto) hwIterSel(Data const& init) {
Data best = init;
for(std::size_t i = 0; i < n; ++i) {
Data current = taskD(best);
best = select(std::move(current), std::move(best));
}
return best;
}
constexpr auto eIterSel = &link<Data(Data const&)>(n * eTaskD) ->* eSelect;
constexpr auto eIterSelStdFun = &link<Data(Data const&)>(n * eTaskDStdFun) ->* eSelectStdFun;
BASELINE(IterSel, Handwritten, samples, iterations) {
celero::DoNotOptimizeAway(
hwIterSel(initVector)
);
}
BENCHMARK(IterSel, Skeleton, samples, iterations) {
auto iterSel = alsk::edsl::implement<alsk::exec::Sequential>(eIterSel);
celero::DoNotOptimizeAway(
iterSel(initVector)
);
}
BENCHMARK(IterSel, SkeletonStdFunction, samples, iterations) {
auto iterSel = alsk::edsl::implement<alsk::exec::Sequential>(eIterSelStdFun);
iterSel.skeleton.task = taskD;
iterSel.skeleton.select = bench::select;
celero::DoNotOptimizeAway(
iterSel(initVector)
);
}