00001 # include <mln/core/image/image2d.hh> 00002 # include <mln/util/timer.hh> 00003 00004 # include <mln/core/pixter2d.hh> 00005 # include <mln/opt/at.hh> 00006 00007 00008 int size; 00009 00010 00011 float a_la_C() 00012 { 00013 unsigned len = size * size; 00014 int* buf = new int[len]; 00015 00016 mln::util::timer t; 00017 t.start(); 00018 int* p = buf; 00019 for (unsigned i = 0; i < len; ++i) 00020 *p++ = 0; 00021 return t.read(); 00022 } 00023 00024 00025 float loops() 00026 { 00027 typedef mln::image2d<int> I; 00028 mln::internal::data<I> data(mln::make::box2d(size, size), 1); 00029 00030 mln::util::timer t; 00031 t.start(); 00032 int** array = data.array_; 00033 for (int row = 0; row < size; ++row) 00034 for (int col = 0; col < size; ++col) 00035 array[row][col] = 0; 00036 return t.read(); 00037 } 00038 00039 00040 float for_at() 00041 { 00042 typedef mln::image2d<int> I; 00043 I ima(size, size); 00044 00045 mln::util::timer t; 00046 t.start(); 00047 for (int row = 0; row < size; ++row) 00048 for (int col = 0; col < size; ++col) 00049 mln::opt::at(ima, row, col) = 0; 00050 return t.read(); 00051 } 00052 00053 00054 float loops_ref() 00055 { 00056 typedef mln::image2d<int> I; 00057 mln::internal::data<I> data(mln::make::box2d(size, size), 1); 00058 00059 mln::util::timer t; 00060 t.start(); 00061 00062 int** array = data.array_; 00063 mln::point2d p; 00064 mln::def::coord & row = p.row(), & col = p.col(); 00065 for (row = 0; row < size; ++row) 00066 for (col = 0; col < size; ++col) 00067 array[row][col] = 0; 00068 00069 return t.read(); 00070 } 00071 00072 00073 float hybrid_1() 00074 { 00075 typedef mln::image2d<int> I; 00076 I ima(size, size); 00077 00078 mln::util::timer t; 00079 t.start(); 00080 mln::point2d p; 00081 mln::def::coord & row = p.row(), & col = p.col(); 00082 for (row = 0; row < size; ++row) 00083 for (col = 0; col < size; ++col) 00084 mln::opt::at(ima, row, col) = 0; 00085 return t.read(); 00086 } 00087 00088 00089 00090 float milena() 00091 { 00092 typedef mln::image2d<int> I; 00093 I ima(size, size); 00094 00095 mln::util::timer t; 00096 t.start(); 00097 mln_piter_(I) p(ima.domain()); 00098 for_all(p) 00099 ima(p) = 0; 00100 return t.read(); 00101 } 00102 00103 00104 float optim() 00105 { 00106 typedef mln::image2d<int> I; 00107 I ima(size, size); 00108 00109 mln::util::timer t; 00110 t.start(); 00111 mln_piter_(I) p(ima.domain()); 00112 for (p.start(); p.is_valid(); p.next()) 00113 ima.alt(p) = 0; 00114 return t.read(); 00115 } 00116 00117 00118 float fast() 00119 { 00120 typedef mln::image2d<int> I; 00121 I ima(size, size); 00122 00123 mln::util::timer t; 00124 t.start(); 00125 mln_pixter_(I) p(ima); 00126 for_all(p) 00127 p.val() = 0; 00128 return t.read(); 00129 } 00130 00131 00132 void usage(char* argv[]) 00133 { 00134 std::cerr << "usage: " << argv[0] << " size" << std::endl; 00135 abort(); 00136 } 00137 00138 00139 int main(int argc, char* argv[]) 00140 { 00141 if (argc != 2) 00142 usage(argv); 00143 size = std::atoi(argv[1]); 00144 00145 std::cout << "*p++ " << a_la_C() << std::endl; 00146 std::cout << "for (r,c) " << loops() << std::endl; 00147 std::cout << "for at(r,c) " << for_at() << std::endl; 00148 std::cout << "for &(r,c) " << loops_ref() << std::endl; 00149 std::cout << "hybrid_1 " << hybrid_1() << std::endl; 00150 std::cout << "for_all(p) " << milena() << std::endl; 00151 std::cout << "optim " << optim() << std::endl; 00152 std::cout << "for_all(pix) " << fast() << std::endl; 00153 }