11#ifdef COMPILATION_INSTRUCTIONS
2- clang++ -O3 -Ofast -std=c++14 -DNDEBUG -Wall -Wextra -Wpedantic -Werror $0 -o $0 .x -lboost_timer && time $0 .x $@ && rm -f $0 .x; exit
2+ clang++ -O3 -Ofast -std=c++14 -DNDEBUG -Wall -Wextra -Wpedantic -Werror $0 -o $0 .x && time $0 .x $@ && rm -f $0 .x; exit
33#endif
44
55#include " ../array_ref.hpp"
66
7- #include < boost/timer/timer.hpp>
8-
7+ #include < chrono>
98#include < iostream>
109#include < numeric>
10+ #include < string>
11+ #include < utility> // move
1112#include < vector>
12- #include < numeric>
1313
1414using std::cout; using std::cerr;
1515namespace multi = boost::multi;
1616
17+ namespace {
18+ // minimal RAII wall-clock timer (replaces boost::timer::auto_cpu_timer)
19+ class auto_timer {
20+ std::string label_;
21+ std::chrono::steady_clock::time_point start_ = std::chrono::steady_clock::now();
22+
23+ public:
24+ explicit auto_timer (std::string label = {}) : label_{std::move (label)} {}
25+ auto_timer (auto_timer const &) = delete ;
26+ auto_timer (auto_timer&&) = delete ;
27+ auto operator =(auto_timer const &) -> auto_timer& = delete ;
28+ auto operator =(auto_timer&&) -> auto_timer& = delete ;
29+ ~auto_timer () {
30+ std::cerr << label_ << std::chrono::duration<double >(std::chrono::steady_clock::now () - start_).count () << " s (wall)\n " ;
31+ }
32+ };
33+ } // namespace
34+
1735int main (){
1836
1937 assert (0 ); // check that NDEBUG is off
@@ -31,15 +49,15 @@ int main(){
3149 double sum_raw;
3250 {
3351 double sum = 0.0 ;
34- boost::timer::auto_cpu_timer t{std::cerr, 3 , " sum: raw %t seconds \n " };
52+ auto_timer t{" sum: raw: " };
3553 for (auto const & e : data) sum += e;
3654 sum_raw = sum;
3755 }
3856 iota (begin (data), end (data), 1.2 ); iota (begin (data), end (data), 202.2 ); data[1234 ] = 399.1 ;
3957 double sum_2D;
4058 {
4159 double sum = 0.0 ;
42- boost::timer::auto_cpu_timer t{std::cerr, 3 , " sum: 2D %t seconds \n " };
60+ auto_timer t{" sum: 2D: " };
4361 auto ext = extensions (data2D_cref);
4462 for (auto i : std::get<0 >(ext)){
4563 for (auto j : std::get<1 >(ext)) sum += data2D_cref (i, j);
@@ -50,7 +68,7 @@ int main(){
5068 double sum_2D_acc;
5169 {
5270 double sum = 0.0 ;
53- boost::timer::auto_cpu_timer t{cerr, 3 , " sum: 2D acc %t seconds \n " };
71+ auto_timer t{" sum: 2D acc: " };
5472 sum = std::accumulate (
5573 begin (data2D_cref), end (data2D_cref), 0.0 ,
5674 [](auto const & a, auto const & b){return a + std::accumulate (begin (b), end (b), 0.0 );}
@@ -60,7 +78,7 @@ int main(){
6078 iota (begin (data), end (data), 1.2 ); iota (begin (data), end (data), 2.15 ); data[1234 ] = 3419.1 ;
6179 double sum_2Dwrong_acc;
6280 {
63- boost::timer::auto_cpu_timer t{cerr, 3 , " sum: 2Dwrong acc %t seconds \n " };
81+ auto_timer t{" sum: 2Dwrong acc: " };
6482 sum_2Dwrong_acc = std::accumulate (
6583 begin (rotated (data2D_cref)), end (rotated (data2D_cref)), 0.0 ,
6684 [](auto const & a, auto const & b){return a + std::accumulate (begin (b), end (b), 0.0 );}
@@ -70,7 +88,7 @@ int main(){
7088 double sum_2Dwrong;
7189 {
7290 double sum = 0.0 ;
73- boost::timer::auto_cpu_timer t{std::cerr, 3 , " sum: 2Dwrong sum %t seconds \n " };
91+ auto_timer t{" sum: 2Dwrong sum: " };
7492 auto const [is, js] = extensions (data2D_cref);
7593 for (auto j : js){
7694 for (auto i : is){
@@ -83,14 +101,14 @@ int main(){
83101 double sum_raw2;
84102 {
85103 double sum = 0.0 ;
86- boost::timer::auto_cpu_timer t{cerr, 3 , " sum: raw %t seconds \n " };
104+ auto_timer t{" sum: raw: " };
87105 for (auto const & e : data) sum += e;
88106 sum_raw2 = sum;
89107 }
90108 iota (begin (data), end (data), 1.2 ); iota (begin (data), end (data), 33.112 ); data[1234 ] = 1199.1 ;
91109 double sum_raw_acc;
92110 {
93- boost::timer::auto_cpu_timer t{cerr, 3 , " sum: raw acc %t seconds \n " };
111+ auto_timer t{" sum: raw acc: " };
94112 sum_raw_acc = std::accumulate (data.data (), data.data () + data.size (), 0 .);
95113 }
96114 cout<< sum_2D + sum_2D_acc + sum_2Dwrong_acc + sum_2Dwrong + sum_raw + sum_raw2 + sum_raw_acc <<std::endl;
@@ -109,14 +127,14 @@ cout<<'\n';
109127 assert ( num_elements (v3D_cref) == std::ptrdiff_t (v.size ()) );
110128 {
111129 double sum = 0.0 ;
112- boost::timer::auto_cpu_timer t{std::cerr, 3 , " sum: 3D raw %t seconds \n " };
130+ auto_timer t{" sum: 3D raw: " };
113131 for (auto const & e : v) sum += e;
114132 cout << sum << ' \n ' ;
115133 }
116134 iota (begin (v), end (v), 1.2 );
117135 {
118136 double sum = 0.0 ;
119- boost::timer::auto_cpu_timer t{std::cerr, 3 , " sum: 3D indexed %t seconds \n " };
137+ auto_timer t{" sum: 3D indexed: " };
120138 auto const [is, js, ks] = extensions (v3D_cref);
121139 for (auto i : is) {
122140 auto const & v3D_crefi = v3D_cref[i];
@@ -132,7 +150,7 @@ cout<<'\n';
132150 iota (begin (v), end (v), 4444.5 );
133151 {
134152 double sum = 0.0 ;
135- boost::timer::auto_cpu_timer t{std::cerr, 3 , " sum: 3Dwrong indexed %t seconds \n " };
153+ auto_timer t{" sum: 3Dwrong indexed: " };
136154 for (auto k : v3D_cref.extension (2 )) // TODO(correaa) this doesn't work anymore
137155 for (auto j : v3D_cref.extension (1 ))
138156 for (auto i : v3D_cref.extension (0 ))
@@ -153,14 +171,14 @@ cout<<'\n';
153171 iota (begin (v), end (v), 0.1 );
154172 {
155173 double sum = 0.0 ;
156- boost::timer::auto_cpu_timer t{std::cerr, 3 , " sum: 4D raw %t seconds \n " };
174+ auto_timer t{" sum: 4D raw: " };
157175 for (auto const & e : v) sum += e;
158176 cout<< sum <<' \n ' ;
159177 }
160178 iota (begin (v), end (v), 1222.1 );
161179 {
162180 double sum = 0.0 ;
163- boost::timer::auto_cpu_timer t{std::cerr, 3 , " sum: 4D indexed %t seconds \n " };
181+ auto_timer t{" sum: 4D indexed: " };
164182 auto const [is, js, ks, ls] = extensions (v4D_cref);
165183 for (auto i : is) {
166184 // auto const& v4D_crefi = v4D_cref[i]; // not necessary in clang or gcc
0 commit comments