DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
testImageContainerBenchmark.cpp
1 
30 
31 #include <iostream>
32 #include "DGtal/base/Common.h"
33 
34 #include "DGtal/base/Common.h"
35 #include "DGtal/kernel/SpaceND.h"
36 #include "DGtal/kernel/domains/HyperRectDomain.h"
37 #include "DGtal/images/ImageSelector.h"
38 
40 
41 using namespace std;
42 using namespace DGtal;
43 
44 
45 template<typename Image>
46 double builtinIteratorScan(const Image &aImage)
47 {
48  long int cpt = 0;
49  double timer;
50 
51  trace.beginBlock( "Built-in iterator simple scan ..." );
52  for ( typename Image::ConstIterator it = aImage.begin(), itend = aImage.end();
53  it != itend ;
54  ++it)
55  cpt += (long int)(*it);
56 
57  timer = trace.endBlock();
58  trace.info() << "Cpt=" << cpt << endl;
59  return timer;
60 }
61 
62 template<typename Image, typename Domain>
63 double domainIteratorScan(const Image &aImage, const Domain &aDomain)
64 {
65  long int cpt = 0;
66  double timer;
67 
68  trace.beginBlock( "Domain iterator simple scan ..." );
69  for ( typename Domain::ConstIterator it = aDomain.begin(),
70  itend = aDomain.end(); it != itend; ++it)
71  cpt += (long int) aImage( (*it) );
72 
73  timer = trace.endBlock();
74  trace.info() << "Cpt=" << cpt << endl;
75  return timer;
76 }
77 
78 template<typename Point, typename Image, typename Domain>
79 bool testSuite(unsigned int dim, unsigned int n)
80 {
81  double alloc, builtinconstiter, domainiter;
82 
83  Point a = Point::zero, b;
84  for (unsigned int i = 0; i < dim; i++)
85  b[i] = n;
86 
87  try
88  {
89 
90  Domain aDomain(a, b);
91  trace.info() << aDomain << endl;
92 
93  trace.beginBlock("init");
94  Image image( aDomain);
95  alloc = trace.endBlock();
96 
97  builtinconstiter = builtinIteratorScan(image);
98  domainiter = domainIteratorScan<Image, Domain>(image, aDomain);
99 
100  trace.warning() << "Dim= " << dim
101  << " n=" << n << " Alloc=" << alloc
102  << " Built-in Iter=" << builtinconstiter
103  << " DomainIter=" << domainiter
104  << endl;
105 
106  std::cout << dim << " " << n << " " << alloc << " " << builtinconstiter
107  << " " << domainiter << std::endl;
108 
109  trace.endBlock();
110  return true;
111  }
112  catch (bad_alloc& ba)
113  {
114  trace.error() << "bad_alloc caught: " << ba.what() << endl;
115  trace.warning() << "Dim= " << dim
116  << " n=" << n << " Alloc= XX"
117  << " Constiter= XX" << endl;
118  std::cout << dim << " " << n << " " << std::endl;
119  return false;
120  }
121 }
122 
123 
125 // Functions for testing class ImageContainerBenchmark.
127 
131 bool testImageContainerBenchmark()
132 {
133  unsigned int dim = 2;
134 
135  std::cout << "#dim n alloc built-in-Iter domain-Iter" << std::endl;
136 
137  for (unsigned int n = 100; n < 2000 ; n = n + 100)
138  {
139  trace.beginBlock("Begin test suite");
140  typedef SpaceND<2> Space;
141  typedef Space::Point Point;
143  //Default image selector = STLVector
145 
146 
147 
148  if (!testSuite<Point, Image, Domain>(dim, n))
149  {
150  trace.endBlock();
151  break;
152  }
153 
154  trace.endBlock();
155  }
156 
157 
158  dim++;
159 
160  for (unsigned int n = 100; n < 2048 ; n = n + 100)
161  {
162  trace.beginBlock("Begin test suite");
163  typedef SpaceND<3> Space;
164  typedef Space::Point Point;
165  typedef HyperRectDomain<Space> Domain;
166  //Default image selector = STLVector
167  typedef ImageSelector<Domain, int>::Type Image;
168 
169  if (!testSuite<Point, Image, Domain>(dim, n))
170  {
171  trace.endBlock();
172  break;
173  }
174 
175  trace.endBlock();
176  }
177 
178  dim++;
179 
180  for (unsigned int n = 50; n < 200 ; n = n + 20)
181  {
182  trace.beginBlock("Begin test suite");
183  typedef SpaceND<4> Space;
184  typedef Space::Point Point;
185  typedef HyperRectDomain<Space> Domain;
186  //Default image selector = STLVector
187  typedef ImageSelector<Domain, int>::Type Image;
188 
189  if (!testSuite<Point, Image, Domain>(dim, n))
190  {
191  trace.endBlock();
192  break;
193  }
194 
195  trace.endBlock();
196  }
197 
198  dim++;
199 
200  for (unsigned int n = 50; n < 100 ; n = n + 10)
201  {
202  trace.beginBlock("Begin test suite");
203  typedef SpaceND<5> Space;
204  typedef Space::Point Point;
205  typedef HyperRectDomain<Space> Domain;
206  //Default image selector = STLVector
207  typedef ImageSelector<Domain, int>::Type Image;
208 
209  if (!testSuite<Point, Image, Domain>(dim, n))
210  {
211  trace.endBlock();
212  break;
213  }
214 
215  trace.endBlock();
216  }
217 
218 
219  return true;
220 }
221 
223 // Standard services - public :
224 
225 int main( int argc, char** argv )
226 {
227  trace.beginBlock ( "Testing class ImageContainerBenchmark" );
228  trace.info() << "Args:";
229  for ( int i = 0; i < argc; ++i )
230  trace.info() << " " << argv[ i ];
231  trace.info() << endl;
232 
233  bool res = testImageContainerBenchmark(); // && ... other tests
234  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
235  trace.endBlock();
236  return res ? 0 : 1;
237 }
238 // //