$extrastylesheet
Olena  User documentation 2.1
An Image Processing Platform
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
doc/benchmark/image2d.cc
1 # include <mln/core/image/image2d.hh>
2 # include <mln/util/timer.hh>
3 
4 # include <mln/core/pixter2d.hh>
5 # include <mln/opt/at.hh>
6 
7 
8 int size;
9 
10 
11 float a_la_C()
12 {
13  unsigned len = size * size;
14  int* buf = new int[len];
15 
17  t.start();
18  int* p = buf;
19  for (unsigned i = 0; i < len; ++i)
20  *p++ = 0;
21  return t.read();
22 }
23 
24 
25 float loops()
26 {
27  typedef mln::image2d<int> I;
28  mln::internal::data<I> data(mln::make::box2d(size, size), 1);
29 
31  t.start();
32  int** array = data.array_;
33  for (int row = 0; row < size; ++row)
34  for (int col = 0; col < size; ++col)
35  array[row][col] = 0;
36  return t.read();
37 }
38 
39 
40 float for_at()
41 {
42  typedef mln::image2d<int> I;
43  I ima(size, size);
44 
46  t.start();
47  for (int row = 0; row < size; ++row)
48  for (int col = 0; col < size; ++col)
49  mln::opt::at(ima, row, col) = 0;
50  return t.read();
51 }
52 
53 
54 float loops_ref()
55 {
56  typedef mln::image2d<int> I;
57  mln::internal::data<I> data(mln::make::box2d(size, size), 1);
58 
60  t.start();
61 
62  int** array = data.array_;
63  mln::point2d p;
64  mln::def::coord & row = p.row(), & col = p.col();
65  for (row = 0; row < size; ++row)
66  for (col = 0; col < size; ++col)
67  array[row][col] = 0;
68 
69  return t.read();
70 }
71 
72 
73 float hybrid_1()
74 {
75  typedef mln::image2d<int> I;
76  I ima(size, size);
77 
79  t.start();
80  mln::point2d p;
81  mln::def::coord & row = p.row(), & col = p.col();
82  for (row = 0; row < size; ++row)
83  for (col = 0; col < size; ++col)
84  mln::opt::at(ima, row, col) = 0;
85  return t.read();
86 }
87 
88 
89 
90 float milena()
91 {
92  typedef mln::image2d<int> I;
93  I ima(size, size);
94 
96  t.start();
97  mln_piter_(I) p(ima.domain());
98  for_all(p)
99  ima(p) = 0;
100  return t.read();
101 }
102 
103 
104 float optim()
105 {
106  typedef mln::image2d<int> I;
107  I ima(size, size);
108 
110  t.start();
111  mln_piter_(I) p(ima.domain());
112  for (p.start(); p.is_valid(); p.next())
113  ima.alt(p) = 0;
114  return t.read();
115 }
116 
117 
118 float fast()
119 {
120  typedef mln::image2d<int> I;
121  I ima(size, size);
122 
124  t.start();
125  mln_pixter_(I) p(ima);
126  for_all(p)
127  p.val() = 0;
128  return t.read();
129 }
130 
131 
132 void usage(char* argv[])
133 {
134  std::cerr << "usage: " << argv[0] << " size" << std::endl;
135  abort();
136 }
137 
138 
139 int main(int argc, char* argv[])
140 {
141  if (argc != 2)
142  usage(argv);
143  size = std::atoi(argv[1]);
144 
145  std::cout << "*p++ " << a_la_C() << std::endl;
146  std::cout << "for (r,c) " << loops() << std::endl;
147  std::cout << "for at(r,c) " << for_at() << std::endl;
148  std::cout << "for &(r,c) " << loops_ref() << std::endl;
149  std::cout << "hybrid_1 " << hybrid_1() << std::endl;
150  std::cout << "for_all(p) " << milena() << std::endl;
151  std::cout << "optim " << optim() << std::endl;
152  std::cout << "for_all(pix) " << fast() << std::endl;
153 }