HSP3 命令速度調査
誤差はあります。適当に曲とかかけながら測定してるし。
Celeron2.3Ghzで 10万回 repeatをかけます。
時間取得はtimeGetTimeによって行う。
何も表記しない 6ms ;何も書かなくてもrepeatすればsystem変数のcntがインクリメントされてたりするから時間はかかる。
color 0,0,0 151ms
color 0,0,0 151ms(パレットモード)
mes "a" 1596ms
mes "a" 2294ms(パレットモード)
mes "" 69ms
aho 69ms(#define aho mes "" を定義した状態)
font "" 2345ms
line 0,0,0,0 2022ms
line 0,0,32,0 2035ms
line 0,0,0,100 3491ms
line 0,0,320,100 70279ms;斜め…遅すぎて途中で止めかけた
line 0,0,0,0 1701ms(パレットモード)
line 0,0,32,0 1777ms(パレットモード)
line 0,0,320,0 1998ms(パレットモード) ;直線なら速度はあまり落ちない
line 0,0,0,100 3293ms(パレットモード) ;縦のほうがかなり低速
line 0,0,320,100 17713ms(パレットモード)ななめはメチャおそい
boxf 0,0,0,0 2118ms
boxf 0,0,32,32 5508ms
boxf 0,0,0,0 1861ms(パレットモード)
boxf 0,0,32,32 3503ms(パレットモード)
circle 0,0,32,32,0 6306ms
circle 0,0,32,32,0 4925ms(パレットモード)
circle 0,0,32,32,1 5900ms(パレットモード)
gcopy 0,0,0,0,0 690ms
gcopy 0,0,0,32,32 5346ms
gcopy 0,0,0,0,0 961ms (パレットモード)
gcopy 0,0,0,32,32 2545ms(パレットモード)
gmode 0 21ms
gmode 2 21ms
gmode 0,0,0 21ms
a=ginfo(0) 37ms
pos 0,0 28ms
pos 100,100 29ms ;数値入れても同じ
pget 0,0 315ms
pget 0,0 320ms(パレットモード)
pset 0,0 1765ms
pset 0,0 1654ms(パレットモード)
dim a,64 81ms
sdim a,8,8 171ms
パレットモードgcopyさらに詳しく
なんか計測するごとに時間が+-100msくらい前後したので数回測っての平均値です。
gcopy 0,0,0,1,1 : 1642ms
gcopy 0,0,0,2,2 : 1741ms
gcopy 0,0,0,4,4 : 1873ms
gcopy 0,0,0,8,8 : 2046ms
gcopy 0,0,0,24,24: 2179ms
gcopy 0,0,0,17,17: 2361ms :16*16使うくらいならこちらをどうぞ
gcopy 0,0,0,16,32: 2378ms
gcopy 0,0,0,15,15: 2409ms
gcopy 0,0,0,32,32: 2453ms
gcopy 0,0,0,64,32: 2483ms :32*32と殆ど変わらん…!?
gcopy 0,0,0,12,12: 2652ms :非常に遅い
gcopy 0,0,0,48,48: 2678ms
gcopy 0,0,0,31,31: 2775ms :やはり2の倍数でないのは遅い
gcopy 0,0,0,32,64: 2976ms :64*32よりかなり遅い…!?
gcopy 0,0,0,16,16: 3070ms :やたら遅い
gcopy 0,0,0,64,64: 3200ms
gcopy 0,0,0,63,63: 4493ms :やはり2の倍数でなくなると遅い
gcopy 0,0,0,128,64: 4873ms
gcopy 0,0,0,96,96: 5440ms
gcopy 0,0,0,127,127:9097ms :128*128と大して変わらん
gcopy 0,0,0,128,128:9151ms
gcopy 0,0,0,160,160:13925ms
判ったのは単純にコピー面積に時間が正比例していないという事。
16*16が意外と遅いのが判明。
中途半端な値は基本的に処理速度低下になりますが、(17*17は例外か?)
128*128を超えたあたりから面積と処理時間が正比例した感じになります。
a=1,b=1,e=""として。
if a: 18ms ;速い
if a=0: 30ms
if a=1: 30ms
if a&b: 31ms
if a and b: 31ms
if a|b: 31ms
if a or b: 31ms
if a=0|b=0: 50ms ;片方が偽なのにもう片方も計算してる
if a=1|b=0: 50ms ;のがこれでわかる。
if a=1&b=1: 53ms
if a=0&b=1: 53ms
if a=0&b=0&a=0: 77ms ;最初のa=0で判定抜ければいいのに抜けてない。
if a=1&b=0&a=0: 77ms
if a=1&&b=0&&a=0: 77ms ;&&使っても同じ。
if a=1:if b=0:if a=0:49ms ;なので&で偽なら入れ子が最速
if a+b+c>0: 49ms ;状況によるが、足し算でorもどきも速い
if a!0: 28ms ;どれでも殆ど変わらん
if a>0: 26ms ;違いは多分誤差
if a>=0: 26ms
if a<0: 29ms
if a<=0: 29ms
if e="" 122ms
if e="a" 127ms
if e="あ" 127ms
if e="syagamisrash" 127ms
switch a 131ms
case 0
swbreak
case 1
swbreak
case 2
swbreak
swend
switch a 137ms ;caseが7個増えても大してかわんね
case 0
swbreak
case 1
swbreak
case 2
case 3
case 4
case 5
case 6
case 7
case 8
case 9
swbreak
swend
for i,0,100000,1
next ;repeat.loopでなく、forを使うと無表記で55ms
whileはcnt++しないのでもしかしたら最も速いかもしれないが測定方法がわからん。
Celeron2.3Ghzで 100万回 repeatをかけます。
何も表記しない 66ms
a=1 245ms
a=a 248ms
a=-a 303ms
a=a+1 302ms
a=a+10 302ms
a++ 151ms
a-- 159ms
a+=1 252ms
a+=10 257ms
a=a*1 303ms
a=a*2 305ms
a=a<<1 304ms
a=a>>1 304ms
a=a/1 313ms
a=a/2 325ms
a=a^1 302ms
a=a^15 302ms
a=a&1 302ms
a=a&15 302ms
a=a&1023 302ms
a=a|511 302ms
a.0=1:a.1=1 717ms
a=1,1 373ms
e=peek(a,1) 519ms
poke a,0,255 338ms
e="" 703ms
e="a" 721ms
e=str(a) 952ms
a=int(e) 912ms
a=sin(3.14159265358979323846264338327950288419*i/512) 920ms
a=sin(0) 464ms
a=sin(108) 500ms
a=abs(-200) 405ms
a=abs(200) 405ms
a=rnd(2) 435ms
a=rnd(128) 435ms
getkey a,1 301ms
stick a,0,0 4069ms
dup a,b 261ms
a=a+a+a+a+a 619ms
a=((a+a)+(a+a)+a) 662ms;括弧をつけると低速化
a=double(0.25)
b=double(0.25)
a=a+b 435ms double型の変数とし、計算を行う。やはり、整数より遅い。
a=a/b 928ms
a=a*b 438ms
gosub *as 534ms return以外無記述のサブルーチン。タダではない。安いけど
goto *as 100ms goto。ネストもくそもないのであたりまえか。
Celeron2.3Ghzで1000回repeat
picload "asasas.bmp" 825ms (32*32)
picload "asasas.bmp" 864ms (64*64)
picload "asasas.bmp" 1472ms (パレットモード、32*32)わかっちゃいたが
picload "asasas.bmp" 1592ms (パレットモード、64*64)gcopyの50倍は遅い。
計測用スクリプト
screen 0,,,0
#uselib "winmm.dll"
#func timegettime "timeGetTime"
#func timeBeginPeriod "timeBeginPeriod" int
#func timeEndPeriod "timeEndPeriod" int
timeBeginPeriod 1
timegettime
kako=stat
repeat 1000000
loop
timegettime
kako=stat-kako
pos 50,50:mes ""+kako+"ミリ秒"
stop
return