[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[WitchTech 00141] Re: graph lib
- Subject: [WitchTech 00141] Re: graph lib
- From: Akira Kawamata <autumn@piedey.co.jp>
- Date: Fri, 28 Jul 2000 19:56:46 +0900
川俣です。
仕事が立て込んでいて、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