HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0905
てんプログラムの速度向上のための小ワザ6解決


てん

リンク

2012/9/5(Wed) 20:03:41|NO.49158

こんにちは 最近連投気味のてんです。

別スレにて多分岐構造の高速化についてをテーマにしましたが、他にも皆様が処理速度向上のために
使っている小ワザなどが有りましたら、この場で共有できたらなと思いこういったスレを作りました。

また、多分岐構造のように、様々な表記の方法があるプログラムについて、どの表記が最も高速なのか
についてもいろいろ検証して報告するようなスレにできたらと思います。



この記事に返信する


てん

リンク

2012/9/5(Wed) 20:09:22|NO.49159

■ +1 の表記について

変数に1を足す時の書き方についてです。
おそらく以下の3パターンがあるのではないでしょうか
 a = a+1
◆a += 1
 a ++
この3つで速度が変わるのか実験しました。テストスクリプトは以下のとおり

//Test Start t_start = (gettime(5)*60+gettime(6))*1000+gettime(7) repeat 1000000 gosub *test loop t_end = (gettime(5)*60+gettime(6))*1000+gettime(7) //Result dialog (t_end - t_start) end *test a = 0 a = a+1 return

要は100万回足し算を繰り返すというものです。結果は以下のようになりました。(単位:ms)

a= a+1 : 1024 1043 1032 a += 1 : 855 831 842 a ++ : 725 742 736

というわけで、一番早く計算できたのは a++ の表記法でした。
仕組みはぶっちゃけわかっておりません。どなたか詳しい方が解説してくれると思われ。


足し算でもこんなに差が出るんだなぁという話でした。



y.tack

リンク

2012/9/5(Wed) 20:18:54|NO.49160

OPEN HSPとかちょっと覗いただけですけどHSPの実行的に考えて
a=a+1
a+1を実行し値をどっかにおいてaに代入
a+=1
aを対象にして加算
差はたぶん一回どっかに置いとく分
a++
a+=1
との差は1という数値をCPUに読み込む分
アセンブラでも++の命令は専用にあるはず

拙い解説で申し訳ない
でもどうやって実行するか考えたら
遅い順にやってることが多いと予想されます



y.tack

リンク

2012/9/5(Wed) 20:39:46|NO.49162

HSPTV!用スクリプトを書いてると
繰り返し時に選択でどれくらいsizeが違うか疑問に思ってたんで調べてみました

#cmpopt optprm 0 repeat 10 mes cnt loop
start.axのsize 142byte

#cmpopt optprm 0 i=0 for i,0,10 mes i next
start.axのsize 198byte

#cmpopt optprm 0 i=0 while i<10 mes i i++ wend
start.axのsize 196byte

やぱりrepeatが一番小さいですね
でもforとwhileが大きさほぼ同じなのは意外です
(差がつくと思った)



y.tack

リンク

2012/9/5(Wed) 20:46:25|NO.49163

続きましてa=a+1とa+=1とa++のsizeの違いを調べてみました

#cmpopt optprm 0 a=0 a=a+1 mes a
start.axのsize 154byte

#cmpopt optprm 0 a=0 a+=1 mes a
start.axのsize 146byte

#cmpopt optprm 0 a=0 a++ mes a
start.axのsize 142byte



ridanlue

リンク

2012/9/5(Wed) 21:01:12|NO.49164

0とnを交互に得る計算

a=n-a // トロい. ただしnが実数でも使える a=a xor n // 僅差でn-aより速い a^=n // 最速 a^n // 同じく最速だが、上手く動かないことも?



(´ω`)

リンク

2012/9/6(Thu) 15:59:13|NO.49173

汎用的に実行速度を測るソースを作ってみますた。
調べてみたいソースを5回、1秒間隔で実行して平均を出します。(´ω`)


#uselib "kernel32.dll" #func global GetTickCount "GetTickCount" screen 0, 640, 480, , (ginfo(20)-640)/2, (ginfo(21)-480)/2 dim rs, 5 repeat 5 wait 100 gettickcount : ts = stat repeat 1000000 //========== このループ内に処理を書く //========== ここまで loop gettickcount : te = stat mes "start: "+str(ts)+" / end: "+str(te)+"\nelapsed: "+str(te - ts)+"\n" rs(cnt) = te-ts loop ave = (double(rs(0))+double(rs(1))+double(rs(2))+double(rs(3))+double(rs(4)))/5 mes "Ave. "+str(ave)



ONION software Copyright 1997-2018(c) All rights reserved.