perftest.cpp

Go to the documentation of this file.
00001 #include <vector>
00002 #include <algorithm>
00003 #include <numeric>
00004 #include <boost/bind.hpp>
00005 #include <cmath>
00006 #include <functional>
00007 #include <boost/numeric/ublas/vector.hpp>
00008 #include <boost/numeric/ublas/vector_expression.hpp>
00009 
00010 namespace ublas = boost::numeric::ublas;
00011 using namespace std;
00012 using namespace gplib;
00013 
00014 const int size = 1000000;
00015 const int iterations = 1;
00016 
00017 void f(vector<double> &v1, vector<double> &v2, vector<double> &v3, vector<
00018     double> &v4)
00019   {
00020     transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), boost::bind(
00021         std::multiplies<double>(), boost::bind<double>(std::minus<double>(),
00022             _1, _2), boost::bind<double>(std::minus<double>(), _1, _2)));
00023     copy(v2.begin(), v2.end(), v4.begin());
00024     double value = accumulate(v3.begin(), v3.end(), 0.0);
00025   }
00026 
00027 void g(vector<double> &v1, vector<double> &v2, vector<double> &v3, vector<
00028     double> &v4)
00029   {
00030     double value = 0;
00031     for (size_t i = 0; i < v1.size(); ++i)
00032       {
00033         v3.at(i) = pow(v1.at(i) - v2.at(i), 2);
00034         v4.at(i) = v2.at(i);
00035         value += v3.at(i);
00036         //v3.at(i) = v1.at(i) * v2.at(i);
00037       }
00038   }
00039 
00040 void h(vector<double> &v1, vector<double> &v2, vector<double> &v3, vector<
00041     double> &v4)
00042   {
00043     typedef vector<double>::iterator tit;
00044     double value = 0;
00045     for (tit it1 = v1.begin(), it2 = v2.begin(), it3 = v3.begin(), it4 =
00046         v4.begin(); it1 != v1.end(); ++it1, ++it2, ++it3, ++it4)
00047       {
00048         *it3 = (*it1 - *it2) * (*it1 - *it2);
00049         *it4 = *it2;
00050         value += *it3;
00051       }
00052   }
00053 
00054 void ublasf(ublas::vector<double> &v1, ublas::vector<double> &v2,
00055     ublas::vector<double> &v3, ublas::vector<double> &v4)
00056   {
00057     transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), boost::bind(
00058         std::multiplies<double>(), boost::bind<double>(std::minus<double>(),
00059             _1, _2), boost::bind<double>(std::minus<double>(), _1, _2)));
00060     v2 = v4;
00061     double value = ublas::sum(v3);
00062   }
00063 
00064 void ublasg(ublas::vector<double> &v1, ublas::vector<double> &v2,
00065     ublas::vector<double> &v3, ublas::vector<double> &v4)
00066   {
00067     double value = 0;
00068     for (size_t i = 0; i < v1.size(); ++i)
00069       {
00070         v3(i) = pow(v1(i) - v2(i), 2);
00071         v4(i) = v2(i);
00072         value += v3(i);
00073         //v3.at(i) = v1.at(i) * v2.at(i);
00074       }
00075   }
00076 
00077 void ublash(ublas::vector<double> &v1, ublas::vector<double> &v2,
00078     ublas::vector<double> &v3, ublas::vector<double> &v4)
00079   {
00080     typedef ublas::vector<double>::iterator tit;
00081     double value = 0;
00082     for (tit it1 = v1.begin(), it2 = v2.begin(), it3 = v3.begin(), it4 =
00083         v4.begin(); it1 != v1.end(); ++it1, ++it2, ++it3, ++it4)
00084       {
00085         *it3 = (*it1 - *it2) * (*it1 - *it2);
00086         *it4 = *it2;
00087         value += *it3;
00088       }
00089   }
00090 int main()
00091   {
00092     vector<double> V1(size, 2.), V2(size, 1.5), V3(size, 1.1), V4(size, 1.3);
00093     f(V1, V2, V3, V4);
00094     g(V1, V2, V3, V4);
00095     h(V1, V2, V3, V4);
00096 
00097     ublas::vector<double> U1(size), U2(size), U3(size), U4(size);
00098 
00099     ublasf(U1, U2, U3, U4);
00100     ublasg(U1, U2, U3, U4);
00101     ublash(U1, U2, U3, U4);
00102   }

Generated on Tue May 4 16:52:14 2010 for GPLIB++ by  doxygen 1.5.8