Przepraszam za moje pytanie do Valarray ponownie. Próbuję go użyć, ponieważ jest bardzo podobny do Matlaba podczas pracy z macierzami wektorowymi &. Najpierw sprawdziłem wydajność i stwierdziłem, że valarray nie może osiągnąć wydajności zadeklarowanej w języku programowania C++ książki stroustrup.dlaczego valarray jest taki wolny?
Program testowy faktycznie pomnożył 5M dubletów. Pomyślałem, że c = a * b będzie co najmniej porównywalne do mnożenia elementu podwójnej pętli for, ale całkowicie się mylę. Próbowałem na kilku komputerach i vc6.0 i vs2008.
Nawiasem mówiąc, ja testowałem na Matlab używając następującego kodu:
len=5*1024*1024;
a=rand(len,1);b=rand(len,1);c=zeros(len,1);
tic;c=a.*b;toc;
a wynik jest 46ms. Ten czas nie jest wysoką precyzją, działa tylko jako odniesienie.
Kod jest:
#include <iostream>
#include <valarray>
#include <iostream>
#include "windows.h"
using namespace std ;
SYSTEMTIME stime;
LARGE_INTEGER sys_freq;
double gettime_hp();
int main()
{
enum { N = 5*1024*1024 };
valarray<double> a(N), b(N), c(N) ;
QueryPerformanceFrequency(&sys_freq);
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()
{
LARGE_INTEGER tick;
extern LARGE_INTEGER sys_freq;
QueryPerformanceCounter(&tick);
return (double)tick.QuadPart*1000.0/sys_freq.QuadPart;
}
Wyniki bieżących: (tryb uwalniania z maksymalną optymalizację prędkości) tryb
double operator* 52.3019 ms
valarray operator* 128.338 ms
valarray[i] operator* 43.1801 ms
------------------------------------------------------
double operator* 43.4036 ms
valarray operator* 145.533 ms
valarray[i] operator* 44.9121 ms
------------------------------------------------------
double operator* 43.2619 ms
valarray operator* 158.681 ms
valarray[i] operator* 43.4871 ms
------------------------------------------------------
double operator* 42.7317 ms
valarray operator* 173.164 ms
valarray[i] operator* 80.1004 ms
------------------------------------------------------
double operator* 43.2236 ms
valarray operator* 158.004 ms
valarray[i] operator* 44.3813 ms
------------------------------------------------------
debugowanie z samej optymalizacji:
double operator* 41.8123 ms
valarray operator* 201.484 ms
valarray[i] operator* 41.5452 ms
------------------------------------------------------
double operator* 40.2238 ms
valarray operator* 215.351 ms
valarray[i] operator* 40.2076 ms
------------------------------------------------------
double operator* 40.5859 ms
valarray operator* 232.007 ms
valarray[i] operator* 40.8803 ms
------------------------------------------------------
double operator* 40.9734 ms
valarray operator* 234.325 ms
valarray[i] operator* 40.9711 ms
------------------------------------------------------
double operator* 41.1977 ms
valarray operator* 234.409 ms
valarray[i] operator* 41.1429 ms
------------------------------------------------------
double operator* 39.7754 ms
valarray operator* 234.26 ms
valarray[i] operator* 39.6338 ms
------------------------------------------------------
Czy uruchomiłeś plik wykonywalny? czy próbowałeś go w debugerze (poprzez visual studio)? –
Jakie ustawienia optymalizacji używasz? –
Nie ma różnicy w debugerze ani exe – shangping