刚刚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来完成初始化工作。但,最根本还是应该减少计算机的计算量。