(sguox002原创作品,欢迎批评,转载请保留作者信息)
std::valarray有着很多吸引人的特性。比如下标数组,切割,逻辑,算术运算。我们慢慢学习。
在这之前,我想看一下这个类的性能如何,因此我编了一个小程序,来做同样的计算。结果发现valarray要比普通的循环要慢得多。我将会在另一片文章中说明如何解决这个问题。
#include <iostream>
#include <valarray>#include <iostream>
#include "windows.h"
using namespace std ;
class hptime
{
LARGE_INTEGER sys_freq;
public:
hptime(){QueryPerformanceFrequency(&sys_freq);}
double gettime()
{
LARGE_INTEGER tick;
QueryPerformanceCounter(&tick);
return (double)tick.QuadPart*1000.0/sys_freq.QuadPart;
}
};
int main()
{
hptime t0;
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=t0.gettime();
for( i=0 ; i<N ; ++i ) c1[i] = a1[i] * b1[i] ;
dtime=t0.gettime()-dtime;
cout << "double operator* " << dtime << " ms\n" ;
dtime=t0.gettime();
c = a*b ;
dtime=t0.gettime()-dtime;
cout << "valarray operator* " << dtime << " ms\n" ;
dtime=t0.gettime();
for( i=0 ; i<N ; ++i ) c[i] = a[i] * b[i] ;
dtime=t0.gettime()-dtime;
cout << "valarray[i] operator* " << dtime<< " ms\n" ;
cout << "------------------------------------------------------\n" ;
}
}
打开优化运行结果为:
double operator* 60.655 ms
valarray operator* 149.445 ms
valarray[i] operator* 37.7197 ms
------------------------------------------------------
double operator* 33.4131 ms
valarray operator* 113.355 ms
valarray[i] operator* 37.4807 ms
------------------------------------------------------
double operator* 32.4348 ms
valarray operator* 111.492 ms
valarray[i] operator* 38.5 ms
------------------------------------------------------
double operator* 32.9003 ms
valarray operator* 112.317 ms
valarray[i] operator* 37.0661 ms
------------------------------------------------------
这个程序中有几点值得指出:
1。类的私有成员仍然可以通过指针直接存取,C++只是提供编译时的存取控制,从概念上实现封装,但是它不能防止任何运行时的存取。
2。VCdebug模式的运行结果更慢,可能10倍以上。是因为类里的assert等检查都会严重影响性能。(The reason of slowness stated here is not true in this case, see the other article Debug&Release for details-----by the author)
3。高精度时钟,其精度在微秒。