Imported Upstream version 1.51.0
[platform/upstream/boost.git] / libs / numeric / ublas / bench3 / bench3.cpp
1 //
2 //  Copyright (c) 2000-2002
3 //  Joerg Walter, Mathias Koch
4 //
5 //  Distributed under the Boost Software License, Version 1.0. (See
6 //  accompanying file LICENSE_1_0.txt or copy at
7 //  http://www.boost.org/LICENSE_1_0.txt)
8 //
9 //  The authors gratefully acknowledge the support of
10 //  GeNeSys mbH & Co. KG in producing this work.
11 //
12
13 #include "bench3.hpp"
14
15 void header (std::string text) {
16     std::cout << text << std::endl;
17 }
18
19 template<class T>
20 struct peak_c_plus {
21     typedef T value_type;
22
23     void operator () (int runs) const {
24         try {
25             static T s (0);
26             boost::timer t;
27             for (int i = 0; i < runs; ++ i) {
28                 s += T (0);
29 //                sink_scalar (s);
30             }
31             footer<value_type> () (0, 1, runs, t.elapsed ());
32         }
33         catch (std::exception &e) {
34             std::cout << e.what () << std::endl;
35         }
36     }
37 };
38 template<class T>
39 struct peak_c_multiplies {
40     typedef T value_type;
41
42     void operator () (int runs) const {
43         try {
44             static T s (1);
45             boost::timer t;
46             for (int i = 0; i < runs; ++ i) {
47                 s *= T (1);
48 //                sink_scalar (s);
49             }
50             footer<value_type> () (0, 1, runs, t.elapsed ());
51         }
52         catch (std::exception &e) {
53             std::cout << e.what () << std::endl;
54         }
55     }
56 };
57
58 template<class T>
59 void peak<T>::operator () (int runs) {
60     header ("peak");
61
62     header ("plus");
63     peak_c_plus<T> () (runs);
64
65     header ("multiplies");
66     peak_c_multiplies<T> () (runs);
67 }
68
69
70 template <typename scalar> 
71 void do_bench (std::string type_string, int scale)
72 {
73     header (type_string);
74     peak<scalar> () (1000000 * scale);
75
76     header (type_string + ", 3");
77     bench_1<scalar, 3> () (1000000 * scale);
78     bench_2<scalar, 3> () (300000 * scale);
79     bench_3<scalar, 3> () (100000 * scale);
80
81     header (type_string + ", 10");
82     bench_1<scalar, 10> () (300000 * scale);
83     bench_2<scalar, 10> () (30000 * scale);
84     bench_3<scalar, 10> () (3000 * scale);
85
86     header (type_string + ", 30");
87     bench_1<scalar, 30> () (100000 * scale);
88     bench_2<scalar, 30> () (3000 * scale);
89     bench_3<scalar, 30> () (100 * scale);
90
91     header (type_string + ", 100");
92     bench_1<scalar, 100> () (30000 * scale);
93     bench_2<scalar, 100> () (300 * scale);
94     bench_3<scalar, 100> () (3 * scale);
95 }
96
97 int main (int argc, char *argv []) {
98
99     int scale = 1;
100     if (argc > 1)
101         scale = std::atoi (argv [1]);
102
103 #ifdef USE_FLOAT
104     do_bench<float> ("FLOAT", scale);
105 #endif
106
107 #ifdef USE_DOUBLE
108     do_bench<double> ("DOUBLE", scale);
109 #endif
110
111 #ifdef USE_STD_COMPLEX
112 #ifdef USE_FLOAT
113     do_bench<std::complex<float> > ("COMPLEX<FLOAT>", scale);
114 #endif
115
116 #ifdef USE_DOUBLE
117     do_bench<std::complex<double> > ("COMPLEX<DOUBLE>", scale);
118 #endif
119 #endif
120
121     return 0;
122 }