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) | ||
|  | 	); | ||
|  | } |