mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04:00 
			
		
		
		
	
		
			
	
	
		
			123 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			123 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | //
 | ||
|  | //  Copyright (c) 2000-2002
 | ||
|  | //  Joerg Walter, Mathias Koch
 | ||
|  | //
 | ||
|  | //  Distributed under the Boost Software License, Version 1.0. (See
 | ||
|  | //  accompanying file LICENSE_1_0.txt or copy at
 | ||
|  | //  http://www.boost.org/LICENSE_1_0.txt)
 | ||
|  | //
 | ||
|  | //  The authors gratefully acknowledge the support of
 | ||
|  | //  GeNeSys mbH & Co. KG in producing this work.
 | ||
|  | //
 | ||
|  | 
 | ||
|  | #include "bench1.hpp"
 | ||
|  | 
 | ||
|  | void header (std::string text) { | ||
|  |     std::cout << text << std::endl; | ||
|  | } | ||
|  | 
 | ||
|  | template<class T> | ||
|  | struct peak_c_plus { | ||
|  |     typedef T value_type; | ||
|  | 
 | ||
|  |     void operator () (int runs) const { | ||
|  |         try { | ||
|  |             static T s (0); | ||
|  |             boost::timer t; | ||
|  |             for (int i = 0; i < runs; ++ i) { | ||
|  |                 s += T (0); | ||
|  | //                sink_scalar (s);
 | ||
|  |             } | ||
|  |             footer<value_type> () (0, 1, runs, t.elapsed ()); | ||
|  |         } | ||
|  |         catch (std::exception &e) { | ||
|  |             std::cout << e.what () << std::endl; | ||
|  |         } | ||
|  |     } | ||
|  | }; | ||
|  | template<class T> | ||
|  | struct peak_c_multiplies { | ||
|  |     typedef T value_type; | ||
|  | 
 | ||
|  |     void operator () (int runs) const { | ||
|  |         try { | ||
|  |             static T s (1); | ||
|  |             boost::timer t; | ||
|  |             for (int i = 0; i < runs; ++ i) { | ||
|  |                 s *= T (1); | ||
|  | //                sink_scalar (s);
 | ||
|  |             } | ||
|  |             footer<value_type> () (0, 1, runs, t.elapsed ()); | ||
|  |         } | ||
|  |         catch (std::exception &e) { | ||
|  |             std::cout << e.what () << std::endl; | ||
|  |         } | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T> | ||
|  | void peak<T>::operator () (int runs) { | ||
|  |     header ("peak"); | ||
|  | 
 | ||
|  |     header ("plus"); | ||
|  |     peak_c_plus<T> () (runs); | ||
|  | 
 | ||
|  |     header ("multiplies"); | ||
|  |     peak_c_multiplies<T> () (runs); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | template <typename scalar>  | ||
|  | void do_bench (std::string type_string, int scale) | ||
|  | { | ||
|  |     header (type_string); | ||
|  |     peak<scalar> () (1000000 * scale); | ||
|  | 
 | ||
|  |     header (type_string + ", 3"); | ||
|  |     bench_1<scalar, 3> () (1000000 * scale); | ||
|  |     bench_2<scalar, 3> () (300000 * scale); | ||
|  |     bench_3<scalar, 3> () (100000 * scale); | ||
|  | 
 | ||
|  |     header (type_string + ", 10"); | ||
|  |     bench_1<scalar, 10> () (300000 * scale); | ||
|  |     bench_2<scalar, 10> () (30000 * scale); | ||
|  |     bench_3<scalar, 10> () (3000 * scale); | ||
|  | 
 | ||
|  |     header (type_string + ", 30"); | ||
|  |     bench_1<scalar, 30> () (100000 * scale); | ||
|  |     bench_2<scalar, 30> () (3000 * scale); | ||
|  |     bench_3<scalar, 30> () (100 * scale); | ||
|  | 
 | ||
|  |     header (type_string + ", 100"); | ||
|  |     bench_1<scalar, 100> () (30000 * scale); | ||
|  |     bench_2<scalar, 100> () (300 * scale); | ||
|  |     bench_3<scalar, 100> () (3 * scale); | ||
|  | } | ||
|  | 
 | ||
|  | int main (int argc, char *argv []) { | ||
|  | 
 | ||
|  |     int scale = 1; | ||
|  |     if (argc > 1) | ||
|  |         scale = std::atoi (argv [1]); | ||
|  | 
 | ||
|  | #ifdef USE_FLOAT
 | ||
|  |     do_bench<float> ("FLOAT", scale); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifdef USE_DOUBLE
 | ||
|  |     do_bench<double> ("DOUBLE", scale); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifdef USE_STD_COMPLEX
 | ||
|  | #ifdef USE_FLOAT
 | ||
|  |     do_bench<std::complex<float> > ("COMPLEX<FLOAT>", scale); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifdef USE_DOUBLE
 | ||
|  |     do_bench<std::complex<double> > ("COMPLEX<DOUBLE>", scale); | ||
|  | #endif
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  |     return 0; | ||
|  | } |