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

[WitchTech 00141] Re: graph lib



 川俣です。
 仕事が立て込んでいて、WonderWitchで遊べない……。かなしい。
 と言うわけで、すぐ試せることだけコメント。

<200007280609.PAA01632@kr027.tsi.co.jp> の、
   "[WitchTech 00140] graph lib" において、
   "Shigeki Yamamoto <shige@tsi.co.jp>"さんは書きました:

> ところで、nビット目が1になっている値を求めるとき、
> 
> 	x = 1<<n ;
> 
> とやるのと、
> 
> 	unsigned char bit[8] = {1,2,4,8,16,32,64,128} ;
> 	x = bit[n] ;
> 
> とやるのとでは、x86の場合っていうかWitchの場合どっちが速くなります?

----------------------------ここから----------------------------------
unsigned char test001( unsigned char n )
{
	unsigned char x;
	x = 1<<n;
	return x;
}

unsigned char bit[8] = {1,2,4,8,16,32,64,128} ;

unsigned char test002( unsigned char n )
{
	unsigned char x;
	x = bit[n] ;
	return x;
}
----------------------------ここまで----------------------------------
 を、

tcc -w -G -S b001.c

注: -Gは速度重視の最適化

 とした結果を見ると……

	x = 1<<n;
	↓
	mov	al,1
	mov	cl,byte ptr [bp+4]
	shl	al,cl
	mov	byte ptr [bp-1],al

	x = bit[n] ;
	↓
	mov	al,byte ptr [bp+4]
	mov	ah,0
	mov	bx,ax
	mov	al,byte ptr DGROUP:_bit[bx]
	mov	byte ptr [bp-1],al

 WonderSwanのCPUの命令実行サイクル数はよくわからないけど。メモリアクセ
スが少なく実行命令も少ないことから、前者の方が速いでしょう。たぶん。
 ただ、後者のコードは無駄が多いですね。16bitCPUは、8bitデータ扱うと効率
が落ちることがありますね。ソースをこう書き換えると改善できますね。

----------------------------ここから----------------------------------
unsigned int bit16[8] = {1,2,4,8,16,32,64,128} ;

unsigned int test003( unsigned int n )
{
	unsigned int x;
	x = bit16[n] ;
	return x;
}
----------------------------ここまで----------------------------------

	x = bit16[n] ;
	↓
	mov	bx,word ptr [bp+4]
	shl	bx,1
	mov	si,word ptr DGROUP:_bit16[bx]

 3命令で実現されてますね。

注:変数xはsiに割り当てられているらしい。メモリ上に書き戻すともう1命令が
増えるので、これが最善かどうかは不明です。それから、メモリバスが8bitとい
う話もあるようなので、その場合は、8bitメモリアクセスに比べて16bitメモリ
アクセスは2倍の時間が掛かる可能性もありますね。そういう意味でも、最善は
最初のパターンでしょう。

 という結論で、はたして合っているのかな?^^;
 ループでぐるぐるまわしてベンチマーク取れば一番確実かな?

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



ML Archives