I am a bit of a newbie to C++ programming. I work on both Win32 and Linux platforms and have noticed sizable performance differences between compiling under GCC and MSVC. In my code, I have localized the performance difference to the sorting of vector containers. I wrote a simple test program to measure the performance difference (appended at the end of this email). The program times the sorting of std::vector's and ublas::vector's populated with 10,000,000 random numbers.
Here are the results when compiled with MSVC 8:
sort of std::vector : 1.89 secs
sort of ublas::vector : 3.078 secs
Here are the results when compiled with GCC:
sort of std::vector : 2.734 secs
sort of ublas::vector : 17.828 secs
... pretty big difference - especially for the ublas vectors - any help in sorting this out would be appreciated. BTW, not defining BOOST_NO_EXCEPTIONS and BOOST_UBLAS_NO_EXCEPTIONS seems to make the results much worse than they already are for GCC and has no effect for MSVC.
Thanks in advance.
Here are the MSVC 8 compiler options:
/O2 /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Yu"stdafx.h
" /Fp"Release\sort_test.pch" /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt
Here are the options I used with GCC
-O3 -malign-double -march=pentium4 -mfpmath=sse -ffast-math
And here is the test code:
//Standard STL includes
//
#define BOOST_NO_EXCEPTIONS
#define BOOST_UBLAS_NO_EXCEPTIONS
#include <boost/numeric/ublas/exception.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/detail/algorithm.hpp>
using namespace std;
namespace ublas = boost::numeric::ublas;
int main()
{
int N = 10000000;
vector<double> std_vec(N);
ublas::vector<double> ubl_vec(N);
time_t st;
double e_time;
//Generate Some Random Numbers
generate(std_vec.begin(), std_vec.end(), rand);
//Fill ublas::vector
for(int i=0;i<std_vec.size();i++)
ubl_vec[i] = std_vec[i];
//Sort std::vector
st = clock();
sort(std_vec.begin(),std_vec.end());
e_time = double(clock()-st)/double(CLOCKS_PER_SEC);
cout << "sort of std::vector : " << e_time << " secs " << endl;
//Sort ublas::vector
st = clock();
sort(ubl_vec.begin(),ubl_vec.end());
e_time = double(clock()-st)/double(CLOCKS_PER_SEC);
cout << "sort of ublas::vector : " << e_time << " secs " << endl;
return 0;
}