#ifndef PFOR_BENCHMARKS_COMMON_H #define PFOR_BENCHMARKS_COMMON_H #include #include #include #include template constexpr auto _ = pfor::ctv; using TimePoint = std::tuple; TimePoint timepoint() { struct rusage usage; getrusage(RUSAGE_SELF, &usage); long realSec = usage.ru_utime.tv_sec + usage.ru_stime.tv_sec; long realUsec = usage.ru_utime.tv_usec + usage.ru_stime.tv_usec; return {realSec, realUsec}; } double timediff(TimePoint const& from, TimePoint const& to) { return std::get<0>(to)-std::get<0>(from) + (std::get<1>(to)-std::get<1>(from))/1'000'000.; } // Operand utility #define OPERAND(Type, name, size, filler) \ Type * name##_ = new Type[size]; \ { \ std::size_t i = 0; \ std::generate_n(name##_, size, [&i]{ return filler; }); \ } \ auto name = pfor::Operand(name##_); #define END_OPERAND(name) delete[] name##_ // Bench utility #define BENCH(K) { \ TimePoint tp0 = timepoint(); \ for(std::size_t k_ = 0; k_ < K; ++k_) { #define END_BENCH() } \ TimePoint tp1 = timepoint(); \ std::cout << "time: " << timediff(tp0, tp1) << std::endl; \ } template void arraysPrinter(K, S) {} template void arraysPrinter(K k, S n, T&& array, Ts&&... arrays) { if(k != 1) { std::cerr << "warning: displays may be false, must set K to 1" << std::endl; std::exit(1); } for(S i = 0; i < n; ++i) std::cout << std::forward(array)[i] << ", "; std::cout << std::endl; arraysPrinter(k, n, std::forward(arrays)...); } #endif