刚刚AC了一题,需要将数组部分初始化为零,为了简单我就用memset将整个数组置零了,在我印象中memset函数的速度是快得惊人的,没想到居然超时了,让我不得不重新审视memset的效率和我那想当然的愚昧。
初始化部分如下:#include<stdio.h>
#define MAX 1000
int ndata[ MAX ][ MAX ];
int main()
{
char a[MAX];
char b[MAX];
int i , j;
int nTemp = 10000;
i = nTemp, j = nTemp;
double BegTime , EndTime;
BegTime = clock();
while( i-- )
{
memset( ndata, 0, sizeof(int) * MAX * MAX );
}
EndTime = clock();
printf(" %g s \n ", (EndTime - BegTime ) / 1000/1000);
BegTime = clock();
while( nTemp-- )
{
for ( i = 0; i <= MAX; i++)
ndata[i][0] = 0;
for ( j = 0; j <= MAX; j++)
ndata[0][j] = 0;
}
EndTime = clock();
printf(" %g s \n ", (EndTime - BegTime ) / 1000/1000);
return 0;
}
3.75s
0.11s
速度相差了三十倍,难怪会超时,为了知道memset的效率,又试了下如下案例
#include<stdio.h>
#define MAX 1000
int ndata[ MAX ][ MAX ];
int main()
{
char a[MAX];
char b[MAX];
int i , j;
int nTemp = 10000;
i = nTemp, j = nTemp;
double BegTime , EndTime;
BegTime = clock();
while( i-- )
{
memset( ndata, 0, sizeof(int) * MAX * MAX );
}
EndTime = clock();
printf(" %g s \n ", (EndTime - BegTime ) / 1000/1000);
BegTime = clock();
while( nTemp-- )
{
/* for ( i = 0; i <= MAX; i++)
ndata[i][0] = 0;
for ( j = 0; j <= MAX; j++)
ndata[0][j] = 0;
*/
for ( i = 0; i < MAX; i++)
for ( j = 0; j < MAX; j++)
ndata[i][j] = 0;
}
EndTime = clock();
printf(" %g s \n ", (EndTime - BegTime ) / 1000/1000);
return 0;
}
上述代码就为了初始化一个大数组,执行结果如下:
3.58s
24.8s
测试结果表明:memset比普通的初始化快7倍,所以应该多用memset来完成初始化工作。但,最根本还是应该减少计算机的计算量。