MT_Tools/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 
00013 const int size = 1000000;
00014 const int iterations = 1;
00015 
00016 
00017 void f(vector<double> &v1,vector<double> &v2,vector<double> &v3,vector<double> &v4)
00018 {
00019         transform(v1.begin(),v1.end(),v2.begin(),v3.begin(),boost::bind(std::multiplies<double>(),
00020                 boost::bind<double>(std::minus<double>(),_1,_2),boost::bind<double>(std::minus<double>(),_1,_2)));
00021         copy(v2.begin(),v2.end(),v4.begin());
00022         double value = accumulate(v3.begin(),v3.end(),0.0);
00023 }
00024 
00025 void g(vector<double> &v1,vector<double> &v2,vector<double> &v3,vector<double> &v4)
00026 {
00027         double value = 0;
00028         for (size_t i = 0; i < v1.size(); ++i)
00029         {
00030                 v3.at(i) = pow(v1.at(i) - v2.at(i),2);
00031                 v4.at(i) = v2.at(i);
00032                 value += v3.at(i);
00033                 //v3.at(i) = v1.at(i) * v2.at(i);
00034         }
00035 }
00036 
00037 void h(vector<double> &v1,vector<double> &v2,vector<double> &v3,vector<double> &v4)
00038 {
00039         typedef vector<double>::iterator tit;
00040         double value = 0;
00041         for (tit it1= v1.begin(),it2=v2.begin(),it3=v3.begin(),it4=v4.begin(); it1 != v1.end(); ++it1,++it2,++it3,++it4)
00042         {
00043                 *it3 = (*it1 -  *it2)*(*it1 -  *it2);
00044                 *it4 = *it2;
00045                 value += *it3;
00046         }
00047 }
00048 
00049 void ublasf(ublas::vector<double> &v1,ublas::vector<double> &v2,ublas::vector<double> &v3,ublas::vector<double> &v4)
00050 {
00051         transform(v1.begin(),v1.end(),v2.begin(),v3.begin(),boost::bind(std::multiplies<double>(),
00052                 boost::bind<double>(std::minus<double>(),_1,_2),boost::bind<double>(std::minus<double>(),_1,_2)));
00053         v2 = v4;
00054         double value = ublas::sum(v3);
00055 }
00056 
00057 void ublasg(ublas::vector<double> &v1,ublas::vector<double> &v2,ublas::vector<double> &v3,ublas::vector<double> &v4)
00058 {
00059         double value = 0;
00060         for (size_t i = 0; i < v1.size(); ++i)
00061         {
00062                 v3(i) = pow(v1(i) - v2(i),2);
00063                 v4(i) = v2(i);
00064                 value += v3(i);
00065                 //v3.at(i) = v1.at(i) * v2.at(i);
00066         }
00067 }
00068 
00069 void ublash(ublas::vector<double> &v1,ublas::vector<double> &v2,ublas::vector<double> &v3,ublas::vector<double> &v4)
00070 {
00071         typedef ublas::vector<double>::iterator tit;
00072         double value = 0;
00073         for (tit it1= v1.begin(),it2=v2.begin(),it3=v3.begin(),it4=v4.begin(); it1 != v1.end(); ++it1,++it2,++it3,++it4)
00074         {
00075                 *it3 = (*it1 -  *it2)*(*it1 -  *it2);
00076                 *it4 = *it2;
00077                 value += *it3;
00078         }
00079 }
00080 int main()
00081 {
00082         vector<double> V1(size,2.),V2(size,1.5),V3(size,1.1),V4(size,1.3);
00083         f(V1,V2,V3,V4);
00084         g(V1,V2,V3,V4);
00085         h(V1,V2,V3,V4);
00086         
00087         ublas::vector<double> U1(size),U2(size),U3(size),U4(size);
00088 
00089         ublasf(U1,U2,U3,U4);
00090         ublasg(U1,U2,U3,U4);
00091         ublash(U1,U2,U3,U4);
00092 }

Generated on Tue Aug 4 16:04:07 2009 for GPLIB++ by  doxygen 1.5.8