• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  ///////////////////////////////////////////////////////////////
2  //  Copyright 2011-9 John Maddock. Distributed under the Boost
3  //  Software License, Version 1.0. (See accompanying file
4  //  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
5  
6  #include "performance_test.hpp"
7  
8  #ifdef TEST_MPZ
9  #include <gmp.h>
10  #endif
11  #ifdef TEST_MPFR
12  #include <mpfr.h>
13  #endif
14  #include <boost/version.hpp>
15  
16  //
17  // Keys in order are:
18  // Category
19  // Operator
20  // Type
21  // Precision
22  // Time
23  //
24  std::map<std::string, std::map<std::string, std::map<std::string, std::map<int, double> > > > result_table;
25  
26  unsigned bits_wanted; // for integer types
27  
quickbook_results()28  void quickbook_results()
29  {
30     //
31     // Keys in order are:
32     // Category
33     // Operator
34     // Type
35     // Precision
36     // Time
37     //
38     typedef std::map<std::string, std::map<std::string, std::map<std::string, std::map<int, double> > > >::const_iterator category_iterator;
39     typedef std::map<std::string, std::map<std::string, std::map<int, double> > >::const_iterator                         operator_iterator;
40     typedef std::map<std::string, std::map<int, double> >::const_iterator                                                 type_iterator;
41     typedef std::map<int, double>::const_iterator                                                                         precision_iterator;
42  
43     for (category_iterator i = result_table.begin(); i != result_table.end(); ++i)
44     {
45        std::string cat = i->first;
46        cat[0]          = (char)std::toupper((char)cat[0]);
47        std::cout << "[section:" << i->first << "_performance " << cat << " Type Perfomance]" << std::endl;
48  
49        for (operator_iterator j = i->second.begin(); j != i->second.end(); ++j)
50        {
51           std::string op = j->first;
52           std::cout << "[table Operator " << op << std::endl;
53           std::cout << "[[Backend]";
54  
55           for (precision_iterator k = j->second.begin()->second.begin(); k != j->second.begin()->second.end(); ++k)
56           {
57              std::cout << "[" << k->first << " Bits]";
58           }
59           std::cout << "]\n";
60  
61           std::vector<double> best_times(j->second.begin()->second.size(), (std::numeric_limits<double>::max)());
62           for (unsigned m = 0; m < j->second.begin()->second.size(); ++m)
63           {
64              for (type_iterator k = j->second.begin(); k != j->second.end(); ++k)
65              {
66                 if (m < k->second.size())
67                 {
68                    precision_iterator l = k->second.begin();
69                    std::advance(l, m);
70                    if (best_times[m] > l->second)
71                       best_times[m] = l->second ? l->second : best_times[m];
72                 }
73              }
74           }
75  
76           for (type_iterator k = j->second.begin(); k != j->second.end(); ++k)
77           {
78              std::cout << "[[" << k->first << "]";
79  
80              unsigned m = 0;
81              for (precision_iterator l = k->second.begin(); l != k->second.end(); ++l)
82              {
83                 double rel_time = l->second / best_times[m];
84                 if (rel_time == 1)
85                    std::cout << "[[*" << rel_time << "]";
86                 else
87                    std::cout << "[" << rel_time;
88                 std::cout << " (" << l->second << "s)]";
89                 ++m;
90              }
91  
92              std::cout << "]\n";
93           }
94  
95           std::cout << "]\n";
96        }
97  
98        std::cout << "[endsect]" << std::endl;
99     }
100  }
101  
102  #if defined(__HAS_INCLUDE)
103  #if __has_include(<sys/utsname.h>)
104  #define HAS_UTSNAME
105  #include <sys/utsname.h>
106  #endif
107  #endif
108  #ifdef _WIN32
109  #include <windows.h>
110  #endif
111  
quickbook_platform_details()112  void quickbook_platform_details()
113  {
114     std::cout << "[table:platform Platform Details\n[[Platform][";
115  #ifdef HAS_UTSNAME
116     utsname name;
117     uname(&name);
118     std::cout << name.sysname << " " << name.release << ", version " << name.version << ", " << name.machine << "]]\n";
119  #elif defined(_WIN32)
120     std::cout << "Windows ";
121  #ifdef _M_AMD64
122     std::cout << "x64";
123  #elif defined(_M_IX86)
124     std::cout << "x86";
125  #endif
126     std::cout << "]]\n";
127  #endif
128     std::cout << "[[Compiler][" << BOOST_COMPILER << "]]\n";
129  #ifdef TEST_MPZ
130     std::cout << "[[GMP][" << gmp_version << "]]\n";
131  #endif
132  #ifdef TEST_MPFR
133     std::cout << "[[MPFR][" << MPFR_VERSION << "]]\n";
134  #endif
135     std::cout << "[[Boost][" << BOOST_VERSION << "]]\n";
136     std::cout << "[[Run date][" << __DATE__ << "]]\n";
137     std::cout << "]\n\n";
138  }
139  
main()140  int main()
141  {
142     quickbook_platform_details();
143  
144     test01();
145     test02();
146     test03();
147     test04();
148     test05();
149     test06();
150     test07();
151     test08();
152     test09();
153     test10();
154     test11();
155     test12();
156     test13();
157     test14();
158     test15();
159     test16();
160     test17();
161     test18();
162     test19();
163     test20();
164     test21();
165     test22();
166     test23();
167     test24();
168     test25();
169     test26();
170     test27();
171     test28();
172     test29();
173     test30();
174     test31();
175     test32();
176     test33();
177     test34();
178     test35();
179     test36();
180     test37();
181     test38();
182     test39();
183     test40();
184     test41();
185     test42();
186     test43();
187     test44();
188     test45();
189     test46();
190     test47();
191     test48();
192     test49();
193     test50();
194     test51();
195  
196     quickbook_results();
197     return 0;
198  }
199