memset効率テスト


さっきACが1題をつけて、配列の部分をゼロに初期化する必要があって、簡単に私は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 
", (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
", (EndTime - BegTime ) / 1000/1000); return 0; }

3.75s
0.11s
速度が30倍も違うので、タイムアウトするのも無理はありませんが、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 
", (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
", (EndTime - BegTime ) / 1000/1000); return 0; }

上記のコードは、大きな配列を初期化するために、実行結果は次のようになります.
3.58s
24.8s
テストの結果、memsetは通常の初期化より7倍速いため、memsetを多く使って初期化作業を完了すべきであることが明らかになった.しかし、最も根本的にはコンピュータの計算量を減らすべきだ.