Why is valarray so slow?

后端 未结 7 1960
情书的邮戳
情书的邮戳 2020-12-23 15:18

I am trying to use valarray since it is much like MATLAB while operating vector and matrices. I first did some performance check and found that valarray cannot achieve the p

相关标签:
7条回答
  • 2020-12-23 15:39

    I just tried it on a Linux x86-64 system (Sandy Bridge CPU):

    gcc 4.5.0:

    double operator* 9.64185 ms
    valarray operator* 9.36987 ms
    valarray[i] operator* 9.35815 ms
    

    Intel ICC 12.0.2:

    double operator* 7.76757 ms
    valarray operator* 9.60208 ms
    valarray[i] operator* 7.51409 ms
    

    In both cases I just used -O3 and no other optimisation-related flags.

    It looks like the MS C++ compiler and/or valarray implementation suck.


    Here's the OP's code modified for Linux:

    #include <iostream>
    #include <valarray>
    #include <iostream>
    #include <ctime>
    
    using namespace std ;
    
    double gettime_hp();
    
    int main()
    {
        enum { N = 5*1024*1024 };
        valarray<double> a(N), b(N), c(N) ;
        int i,j;
        for(  j=0 ; j<8 ; ++j )
        {
            for(  i=0 ; i<N ; ++i )
            {
                a[i]=rand();
                b[i]=rand();
            }
    
            double* a1 = &a[0], *b1 = &b[0], *c1 = &c[0] ;
            double dtime=gettime_hp();
            for(  i=0 ; i<N ; ++i ) c1[i] = a1[i] * b1[i] ;
            dtime=gettime_hp()-dtime;
            cout << "double operator* " << dtime << " ms\n" ;
    
            dtime=gettime_hp();
            c = a*b ;
            dtime=gettime_hp()-dtime;
            cout << "valarray operator* " << dtime << " ms\n" ;
    
            dtime=gettime_hp();
            for(  i=0 ; i<N ; ++i ) c[i] = a[i] * b[i] ;
            dtime=gettime_hp()-dtime;
            cout << "valarray[i] operator* " << dtime<< " ms\n" ;
    
            cout << "------------------------------------------------------\n" ;
        }
    }
    
    double gettime_hp()
    {
        struct timespec timestamp;
    
        clock_gettime(CLOCK_REALTIME, &timestamp);
        return timestamp.tv_sec * 1000.0 + timestamp.tv_nsec * 1.0e-6;
    }
    
    0 讨论(0)
提交回复
热议问题