[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[WitchTech 00143] ちょっとしたベンチマーク  (Re: graph lib)



 川俣です。
 ちょっと気になったので、ベンチマークしてみました。

1) IRAMとSRAMのスピードの差は?
2) 8bitアクセスと16bitアクセスの差は?
3) 前述のビットシフトパターン、どれが本当に速い?

 条件はTurbo-C 2.0の最適化無し。
 言うまでもなく、このベンチマークは、ある状況での結果であって、状況が変
化すれば、結果も変わる可能性があります。念のため。

 以下のテストの中でNULL LOOPは何もしない繰り返しだけのテスト。他のテス
トからこれの経過時間を引くと、ループ処理に関する時間を差し引いた処理のみ
の時間らしきものが得られるという仕組みです。
 結果は以下の通り。

テスト名	秒	NULL LOOPの値を引いた値
NULL LOOP	4
IRAM 16bit	6	2
IRAM 8bit	6	2
SRAM 16bit	8	4
SRAM 8bit	7	3
x=1<<n;		7	3
x=bit[n];	9	5
x=bit16[n];	9	5

 考察:
 IRAMは16bitと8bitで速度に差はない。
 SRAMは16bitと8bitで速度に差が出る。つまりSRAMに確保する場合は、8bitで
充分の変数は、intよりcharで確保すると有利。
 IRAMはSRAMより高速。最大2倍程度の差が出ている。8bitなら差は小さいが
16bitは差が大きい。つまり、アクセス速度とバス幅の双方に差があると考えら
れる。
 ビットシフトパターンは、やはり、x=1<<n;がもっとも高速。メモリ(IRAM)に
アクセスするよりもレジスタ内で処理する方が高速という、常識的な結論と言え
る。テストしていないがSRAM上なら、x=bit[n];はx=bit16[n];より速いと推測さ
れる。

 使用したプログラムは以下の通り。

#include <stdio.h>
#include <sys/bios.h>

#define COUNT (1000000L)

datetime_t from, to;

void dump( char far * msg, datetime_t far * from, datetime_t far * to )
{
	int n;
	static char buf[256];
	text_screen_init();
	n = (to->minute*60+to->second)-(from->minute*60+from->second);
	sprintf( buf, "%d sec", n );
	text_put_string(0,0,msg);
	text_put_string(0,1,buf);
	key_wait();
}

void main(int argc, char *argv[])
{
	long l;
	int iram16;
	char iram8;
	static int sram16;
	static char sram8;
	static unsigned char bit[8] = {1,2,4,8,16,32,64,128};
	static unsigned int bit16[8] = {1,2,4,8,16,32,64,128};

	rtc_get_datetime_struct( &from );
	for( l=0L; l<COUNT; l++ ) {
	}
	rtc_get_datetime_struct( &to );
	dump( "NULL LOOP", &from, &to );

	rtc_get_datetime_struct( &from );
	for( l=0L; l<COUNT; l++ ) {
		iram16++;
	}
	rtc_get_datetime_struct( &to );
	dump( "IRAM 16bit access", &from, &to );

	rtc_get_datetime_struct( &from );
	for( l=0L; l<COUNT; l++ ) {
		iram8++;
	}
	rtc_get_datetime_struct( &to );
	dump( "IRAM 8bit access", &from, &to );

	rtc_get_datetime_struct( &from );
	for( l=0L; l<COUNT; l++ ) {
		sram16++;
	}
	rtc_get_datetime_struct( &to );
	dump( "SRAM 16bit access", &from, &to );

	rtc_get_datetime_struct( &from );
	for( l=0L; l<COUNT; l++ ) {
		sram8++;
	}
	rtc_get_datetime_struct( &to );
	dump( "SRAM 8bit access", &from, &to );

	rtc_get_datetime_struct( &from );
	for( l=0L; l<COUNT; l++ ) {
		unsigned char x;
		unsigned char n;
		x = 1<<n;
	}
	rtc_get_datetime_struct( &to );
	dump( "x = 1<<n;", &from, &to );

	rtc_get_datetime_struct( &from );
	for( l=0L; l<COUNT; l++ ) {
		unsigned char x;
		unsigned char n;
		x = bit[n];
	}
	rtc_get_datetime_struct( &to );
	dump( "x = bit[n];", &from, &to );

	rtc_get_datetime_struct( &from );
	for( l=0L; l<COUNT; l++ ) {
		unsigned int x;
		unsigned int n;
		x = bit16[n];
	}
	rtc_get_datetime_struct( &to );
	dump( "x = bit16[n];", &from, &to );
}

(株)ピーデー 川俣 晶 (http://www.autumn.org/ mailto:autumn@piedey.co.jp)



ML Archives