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