Blame ETL/test/benchmark.cpp

darco b3016b
/*! ========================================================================
darco b3016b
** Extended Template and Library Test Suite
darco b3016b
** Hermite Curve Test
dooglus 36d01e
** $Id$
darco b3016b
**
darco b3016b
** Copyright (c) 2002 Robert B. Quattlebaum Jr.
darco b3016b
**
darco b3016b
** This package is free software; you can redistribute it and/or
darco b3016b
** modify it under the terms of the GNU General Public License as
darco b3016b
** published by the Free Software Foundation; either version 2 of
darco b3016b
** the License, or (at your option) any later version.
darco b3016b
**
darco b3016b
** This package is distributed in the hope that it will be useful,
darco b3016b
** but WITHOUT ANY WARRANTY; without even the implied warranty of
darco b3016b
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
darco b3016b
** General Public License for more details.
darco b3016b
**
darco b3016b
** === N O T E S ===========================================================
darco b3016b
**
darco b3016b
** ========================================================================= */
darco b3016b
darco b3016b
/* === H E A D E R S ======================================================= */
darco b3016b
darco b3016b
#include <etl clock=""></etl>
darco b3016b
#include <etl hermite=""></etl>
darco b3016b
#include <etl angle=""></etl>
darco b3016b
#include <etl fixed=""></etl>
darco b3016b
#include <etl surface=""></etl>
darco b3016b
#include <etl gaussian=""></etl>
darco b3016b
#include <etl calculus=""></etl>
darco b3016b
#include <stdio.h></stdio.h>
darco b3016b
darco b3016b
/* === M A C R O S ========================================================= */
darco b3016b
darco b3016b
using namespace etl;
darco b3016b
darco b3016b
#define HERMITE_TEST_ITERATIONS		(100000)
darco b3016b
darco b3016b
/* === C L A S S E S ======================================================= */
darco b3016b
darco b3016b
/* === P R O C E D U R E S ================================================= */
darco b3016b
darco b3016b
template <class angle=""></class>
darco b3016b
void angle_cos_speed_test(void)
darco b3016b
{
darco b3016b
	Angle a,b,c,d;
darco b3016b
	float tmp,tmp2;
darco b3016b
darco b3016b
	for(tmp=-1;tmp<1;tmp+=0.000002f)
darco b3016b
	{
darco b3016b
		a=(typename Angle::cos)(tmp);
darco b3016b
		b=(typename Angle::cos)(tmp);
darco b3016b
		c=(typename Angle::cos)(tmp);
darco b3016b
		d=(typename Angle::cos)(tmp);
darco b3016b
		tmp2=((typename Angle::cos)(a)).get();
darco b3016b
		tmp2=((typename Angle::cos)(b)).get();
darco b3016b
		tmp2=((typename Angle::cos)(c)).get();
darco b3016b
		tmp2=((typename Angle::cos)(d)).get();
darco b3016b
	}
fce3e7
	if (tmp2 == 0) return; // disable unused warning
darco b3016b
}
darco b3016b
template <class angle=""></class>
darco b3016b
void angle_sin_speed_test(void)
darco b3016b
{
darco b3016b
	Angle a,b,c,d;
darco b3016b
	float tmp,tmp2;
darco b3016b
darco b3016b
	for(tmp=-1.0;tmp<1.0;tmp+=0.000002f)
darco b3016b
	{
darco b3016b
		a=(typename Angle::sin)(tmp);
darco b3016b
		b=(typename Angle::sin)(tmp);
darco b3016b
		c=(typename Angle::sin)(tmp);
darco b3016b
		d=(typename Angle::sin)(tmp);
darco b3016b
		tmp2=((typename Angle::sin)(a)).get();
darco b3016b
		tmp2=((typename Angle::sin)(b)).get();
darco b3016b
		tmp2=((typename Angle::sin)(c)).get();
darco b3016b
		tmp2=((typename Angle::sin)(d)).get();
darco b3016b
	}
fce3e7
	if (tmp2 == 0) return; // disable unused warning
darco b3016b
}
darco b3016b
template <class angle=""></class>
darco b3016b
void angle_tan_speed_test(void)
darco b3016b
{
darco b3016b
	Angle a,b,c,d;
darco b3016b
	float tmp,tmp2;
darco b3016b
darco b3016b
	for(tmp=-1;tmp<1;tmp+=0.000002f)
darco b3016b
	{
darco b3016b
		a=(typename Angle::tan)(tmp);
darco b3016b
		b=(typename Angle::tan)(tmp);
darco b3016b
		c=(typename Angle::tan)(tmp);
darco b3016b
		d=(typename Angle::tan)(tmp);
darco b3016b
		tmp2=((typename Angle::tan)(a)).get();
darco b3016b
		tmp2=((typename Angle::tan)(b)).get();
darco b3016b
		tmp2=((typename Angle::tan)(c)).get();
darco b3016b
		tmp2=((typename Angle::tan)(d)).get();
darco b3016b
	}
fce3e7
	if (tmp2 == 0) return; // disable unused warning
darco b3016b
}
darco b3016b
template <class angle,="" class="" mytan=""></class>
darco b3016b
void angle_atan2_speed_test(void)
darco b3016b
{
darco b3016b
	Angle a,b,c;
darco b3016b
	float x,y;
darco b3016b
darco b3016b
	for(y=-10;y<10;y+=0.05f)
darco b3016b
		for(x=-10;x<10;x+=0.05f)
darco b3016b
		{
darco b3016b
			a=mytan(y,x);
darco b3016b
			a=mytan(x,y);
darco b3016b
			b=mytan(y,x);
darco b3016b
			b=mytan(x,y);
darco b3016b
			c=mytan(y,x);
darco b3016b
			c=mytan(x,y);
darco b3016b
			a=mytan(y,x);
darco b3016b
			a=mytan(x,y);
darco b3016b
			b=mytan(y,x);
darco b3016b
			b=mytan(x,y);
darco b3016b
			c=mytan(y,x);
darco b3016b
			c=mytan(x,y);
darco b3016b
		}
darco b3016b
}
darco b3016b
darco b3016b
darco b3016b
int surface_and_gaussian_blur_test()
darco b3016b
{
darco b3016b
	int ret=0;
darco b3016b
	etl::clock MyTimer;
darco b3016b
	float endtime;
darco b3016b
darco b3016b
	{
darco b3016b
		surface<float> my_surface(1000,1000);</float>
darco b3016b
darco b3016b
		MyTimer.reset();
darco b3016b
		gaussian_blur(my_surface.begin(),my_surface.end(),30,30);
darco b3016b
		endtime=MyTimer();
darco b3016b
		printf("surface_and_gaussian_blur_test<float>: %f seconds\n",endtime);</float>
darco b3016b
	}
darco b3016b
darco b3016b
	{
darco b3016b
		surface<double> my_surface(1000,1000);</double>
darco b3016b
darco b3016b
		MyTimer.reset();
darco b3016b
		gaussian_blur(my_surface.begin(),my_surface.end(),30,30);
darco b3016b
		endtime=MyTimer();
darco b3016b
		printf("surface_and_gaussian_blur_test<double>: %f seconds\n",endtime);</double>
darco b3016b
	}
darco b3016b
darco b3016b
	{
darco b3016b
		surface<fixed> my_surface(1000,1000);</fixed>
darco b3016b
darco b3016b
		MyTimer.reset();
darco b3016b
		gaussian_blur(my_surface.begin(),my_surface.end(),30,30);
darco b3016b
		endtime=MyTimer();
darco b3016b
		printf("surface_and_gaussian_blur_test<fixed>: %f seconds\n",endtime);</fixed>
darco b3016b
	}
darco b3016b
darco b3016b
	return ret;
darco b3016b
}
darco b3016b
darco b3016b
int hermite_int_test()
darco b3016b
{
darco b3016b
	int ret=0;
darco b3016b
	hermite<int> Hermie;</int>
darco b3016b
	hermite<int>::time_type f;</int>
darco b3016b
	int i;
darco b3016b
darco b3016b
	etl::clock timer;
darco b3016b
	etl::clock::value_type t;
darco b3016b
darco b3016b
	Hermie.p1()=0;
darco b3016b
	Hermie.t1()=40000;
darco b3016b
	Hermie.p2()=0;
darco b3016b
	Hermie.t2()=40000;
darco b3016b
darco b3016b
	Hermie.sync();
darco b3016b
darco b3016b
	{float t;
darco b3016b
	for(f=0.0f,i=0,timer.reset();i
darco b3016b
	{
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
	}
darco b3016b
	}
darco b3016b
	t=timer();
darco b3016b
darco b3016b
	printf("hermite<int>:time=%f milliseconds\n",t*1000);</int>
darco b3016b
	return ret;
darco b3016b
}
darco b3016b
darco b3016b
int hermite_float_test(void)
darco b3016b
{
darco b3016b
	int ret=0;
darco b3016b
	float f; int i;
darco b3016b
darco b3016b
	hermite<float> Hermie;</float>
darco b3016b
	etl::clock timer;
darco b3016b
	double t;
darco b3016b
darco b3016b
	Hermie.p1()=0;
darco b3016b
	Hermie.t1()=1;
darco b3016b
	Hermie.p2()=0;
darco b3016b
	Hermie.t2()=1;
darco b3016b
darco b3016b
	Hermie.sync();
darco b3016b
darco b3016b
	{float t;
darco b3016b
	for(f=0.0f,i=0,timer.reset();i
darco b3016b
	{
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
	}
darco b3016b
	}
darco b3016b
	t=timer();
darco b3016b
darco b3016b
	printf("hermite<float>:time=%f milliseconds\n",t*1000);</float>
darco b3016b
	return ret;
darco b3016b
}
darco b3016b
darco b3016b
int hermite_double_test(void)
darco b3016b
{
darco b3016b
	int ret=0,i;
darco b3016b
	float f;
darco b3016b
darco b3016b
	hermite<double> Hermie;</double>
darco b3016b
	etl::clock timer;
darco b3016b
	double t;
darco b3016b
darco b3016b
	Hermie.p1()=0;
darco b3016b
	Hermie.t1()=1;
darco b3016b
	Hermie.p2()=0;
darco b3016b
	Hermie.t2()=1;
darco b3016b
darco b3016b
	Hermie.sync();
darco b3016b
darco b3016b
	for(f=0.0f,i=0,timer.reset();i
darco b3016b
	{
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		t+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
	}
darco b3016b
	t=timer();
darco b3016b
darco b3016b
	printf("hermite<double>:time=%f milliseconds\n",t*1000);</double>
darco b3016b
	return ret;
darco b3016b
}
darco b3016b
darco b3016b
int hermite_fixed_test(void)
darco b3016b
{
darco b3016b
	int ret=0;
darco b3016b
    int i;
darco b3016b
	hermite<fixed> Hermie;</fixed>
darco b3016b
	hermite<fixed>::time_type f;</fixed>
darco b3016b
	hermite<fixed>::time_type inc(0.0005f), inc2(1.10);</fixed>
darco b3016b
	fixed sum(0);
darco b3016b
darco b3016b
	etl::clock timer;
darco b3016b
	double t;
darco b3016b
darco b3016b
	Hermie.p1()=0;
darco b3016b
	Hermie.t1()=1;
darco b3016b
	Hermie.p2()=0;
darco b3016b
	Hermie.t2()=1;
darco b3016b
darco b3016b
	Hermie.sync();
darco b3016b
darco b3016b
	{fixed t;
darco b3016b
	for(i=0,f=0,timer.reset();i
darco b3016b
	{
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
		sum+=Hermie(f)+Hermie(f+inc2);
darco b3016b
	}
darco b3016b
	}
darco b3016b
	t=timer();
darco b3016b
darco b3016b
	printf("hermite<fixed>:time=%f milliseconds\n",t*1000);</fixed>
darco b3016b
	return ret;
darco b3016b
}
darco b3016b
darco b3016b
int hermite_angle_test(void)
darco b3016b
{
darco b3016b
	int ret=0,i;
darco b3016b
	float f;
darco b3016b
darco b3016b
	hermite<angle> Hermie;</angle>
darco b3016b
	etl::clock timer;
darco b3016b
	angle tmp;
darco b3016b
	double t;
darco b3016b
darco b3016b
	Hermie.p1()=angle::degrees(0);
darco b3016b
	Hermie.t1()=angle::degrees(45);
darco b3016b
darco b3016b
	Hermie.p2()=angle::degrees(-45);
darco b3016b
	Hermie.t2()=angle::degrees(180);
darco b3016b
darco b3016b
	Hermie.sync();
darco b3016b
darco b3016b
	for(f=0.0f,i=0,timer.reset();i
darco b3016b
	{
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
		tmp+=Hermie(f)+Hermie(f+0.1f);
darco b3016b
	}
darco b3016b
	t=timer();
darco b3016b
darco b3016b
	fprintf(stderr,"hermite<angle>:time=%f milliseconds\n",t*1000);</angle>
darco b3016b
darco b3016b
	return ret;
darco b3016b
}
darco b3016b
darco b3016b
darco b3016b
/* === E N T R Y P O I N T ================================================= */
darco b3016b
darco b3016b
int main()
darco b3016b
{
darco b3016b
	int error=0;
darco b3016b
darco b3016b
	error+=surface_and_gaussian_blur_test();
darco b3016b
	error+=hermite_float_test();
darco b3016b
	error+=hermite_double_test();
darco b3016b
	error+=hermite_int_test();
darco b3016b
	error+=hermite_fixed_test();
darco b3016b
	error+=hermite_angle_test();
darco b3016b
darco b3016b
	return error;
darco b3016b
}