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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
1201
tsukahsファイルから命令抽出18解決


tsuka

リンク

2008/12/1(Mon) 18:11:39|NO.21166

sakuraなどの強調キーワードの設定が大変だったので、「hsファイルから抜き出してしまおう」と思い作ったのですが・・・
遅いので時間がかかってしまいます。
このスクリプトだと、どのように高速化できるでしょうか?

#module #deffunc n_mid var p1,int p2 f_list=p1 f_num=p2 notesel f_list noteget buf,f_num return buf #deffunc load str p1,int p2 f_f=p1 f_n=p2 gsa="" n_mid f_f,f_n fname=refstr notesel buf noteload fname gsel 1 objprm 0,buf gsel 0 repeat notemax i++ noteget t_line,cnt if t_line="%index" { noteget t_ture,cnt+1 if t_ture!"システムの許容範囲" & t_ture!"Error Message" { gsa+="\n"+t_ture m_n++ } } wait 0 gsel 1 title fname+" "+cnt+"/"+notemax+" 命令数:"+m_n :gsel 0 loop return ""+gsa #global screen 1 naiyo2="" mesbox naiyo2,ginfo_winx,ginfo_winy,-1 gsel 0 chdir "C:/Program files/hsp31/hsphelp/" ;環境に合わせて設定してください dirlist f_list,"*.hs",1 naiyo="" mesbox naiyo,ginfo_winx,ginfo_winy,-1 notesel f_list max=notemax repeat notemax load f_list,cnt naiyo=naiyo+refstr objprm 0,naiyo wait 1 i++ title ""+i+"/"+max loop dialog "完了" dialog "保存しますか?",2 if stat :dialog "*",17 :notesel naiyo :notesave refstr end



この記事に返信する


tsuka

リンク

2008/12/1(Mon) 18:37:04|NO.21167

最後のところ間違えてました
正しくは

if stat=6 :dialog "*",17 :notesel naiyo :notesave refstr
でした



a

リンク

2008/12/1(Mon) 18:47:15|NO.21168

とりあえず、wait 1をawait 1にしてみたら?



hspail

リンク

2008/12/1(Mon) 19:02:35|NO.21169

titleは時間かかるので、mesを使うようにすると良いかもです。



tsuka

リンク

2008/12/1(Mon) 19:59:30|NO.21172

>aさん
await 1だと余計に遅くなった気がします
await 0なら高速になりました
>hspailさん
titleって時間がかかるんですね・・・
これからはできるだけmesを使うようにします

ありがとうございました



tsuka

リンク

2008/12/1(Mon) 20:29:51|NO.21175

一応報告を・・・
mesを使ってやってみたのですが、mesだけだととても速くなりますが、(titleの16倍ほど速くなる
ちらつきを消すためにredrawを使うととても遅くなってしまいます(titleの約5倍ほどの時間がかかる

なのでtitleを使うことにします



p

リンク

2008/12/1(Mon) 21:44:35|NO.21176

wait、gselの回数、iの不使用、titleの頻度を200行に一度に変えてると、
変更後 46秒
変更前 150秒

まぁ数分の処理なら、画面表示なくしたほうが省時間。
ちなみに画面表示無し(処理のみ)なら 20秒



レノス

リンク

2008/12/1(Mon) 22:07:57|NO.21178

ちょっとアドバイス(?)

・noteget を getstr などで代用する。( noteget は遅いです )
・gsa をはじめから大きめに確保しておく。
 gsa に += ではなく poke を使ってしまったりする。
 → HSPに自動で確保させていると遅くなります。必要に応じて memexpand 推奨。
・naiyo = naiyo + refstr は naiyo += refstr に。
・objprm はループの外へ。いちいち表示すると重い。
・mesbox に表示できる最大の文字数は作ったときに決まるので、
 load しきってから表示するか、メッセージで最大文字数をいじくるかしないと
 数十個の命令しか表示できないはず……? ( 自分だけかもしれない )



tsuka

リンク

2008/12/1(Mon) 22:26:17|NO.21179

>pさん
画面表示無くすとすごい速くなるんですね
進行情報とファイル名だけを表示してみようか、と思います

>レノスさん
たくさんのアドバイスありがとうございます
参考にします

ちなみに私の環境だと、1545個の命令は表示されました

ありがとうございました



tsuka

リンク

2008/12/2(Tue) 00:22:51|NO.21186

アドバイスを参考に、挑戦してみたのですが・・・
初めて使うgetstr、pokeなので全くわかりません
解説をしてるサイトを回りながら組んでみたのが↓なのですが・・・

#module #deffunc n_mid var p1 f_list=p1 f_num=p2 sdim buf,4000 getstr buf,f_list,i@ i@+strsize return buf #deffunc load str p1 f_f=p1 f_n=p2 sdim gsa,500000 //---- ファイルの読み込み ----// n_mid f_f;,f_n fname=refstr notesel buf noteload fname bload fname,buf //---- 命令探し ----// repeat notemax getstr t_line,buf,i3 if t_line="%index" { getstr t_ture,buf,i3+8 if t_ture!"システムの許容範囲" & t_ture!"Error Message" { poke gsa,i2,"\n"+t_ture i2+strsize m_n@++ } } i3+strsize await 0 loop return ""+gsa #global chdir "C:/Program files/hsp31/hsphelp/" ;環境に合わせて設定してください dirlist f_list,"*.hs",1 screen 0,640,480 naiyo="" mesbox naiyo,ginfo_winx,ginfo_winy-ginfo_winy/2,-1 notesel f_list max=notemax repeat max load f_list naiyo+=refstr await 0 loop objprm 0,naiyo n_mid f_list,4 dialog "完了" dialog "保存しますか?",2 if stat=6 :dialog "*",17 :bsave fname,naiyo stop
命令探しのt_lineに一行読み込むところでバッファオーバフローといわれます
sdimで確保しても言われるのでどうしようか困ってます。
もしこのエラーがでなくなってもgsaへの代入がうまくいかないのです・・・



ANTARES

リンク

2008/12/2(Tue) 02:21:44|NO.21188

この場合、pokeはあまり効果がありません。

dialog "hs",16: if stat=0: end dir=getpath(refstr,32) chdir dir dirlist f_list,"*.hs",1 naiyo="" notesel f_list max=notemax p=0 len=strlen(f_list) repeat gsa="" getstr fname,f_list,p: p+=strsize notesel buf noteload fname q=0 len2=strlen(buf) repeat getstr t_line, buf, q: q+=strsize if t_line="%index" { getstr t_ture, buf, q: q+=strsize gsa+=t_ture+"\n" } if q>=len2: break loop naiyo=naiyo+gsa if p>=len:break loop dialog "完了" dialog "保存しますか?",2 if stat==6 { dialog "*",17 if stat: notesel naiyo :notesave refstr } end



ANTARES

リンク

2008/12/2(Tue) 02:25:53|NO.21189

>dir=getpath(refstr,32)
>chdir dir
よく考えたら要りませんね。
dialogでchdirされます。



SYAM

リンク

2008/12/2(Tue) 08:53:33|NO.21193

>ちらつきを消すためにredrawを使うととても遅くなってしまいます

redraw で余計な部分も更新していませんでしたか?
高速化したいのであれば、redraw命令のときに対象となる領域を指定しましょう。
指定しなかった場合、画面全体を更新してしまいます。これは遅いです。



tsuka

リンク

2008/12/2(Tue) 21:30:25|NO.21202

>ANTARESさん
poke使わなくてもよかったんですね・・・
このスクリプトを参考にもう一度作りなおしてみます

>SYAMさん
領域の指定なんてできたんですかっ
いままで、redrawのパラメータは一つしかない、と思ってました

ありがとうございました



レノス

リンク

2008/12/2(Tue) 22:02:07|NO.21203

言葉足らずで逆に混乱させてしまったようで、すいません。

i3 += strsize の strsize が、直前の poke で変更されているのが問題。
そして、memexpand がない。
ANTARESさんのおっしゃるとおり、+=でもOK。( ↓はあえて poke )


f_f=p1 f_n=p2 sdim gsa, 3200 gsa_size = 3200 // gsa に書き込める大きさ //---- ファイルの読み込み ----// n_mid f_f;,f_n fname=refstr notesel buf noteload fname ; bload fname, buf //---- 命令探し ----// repeat notemax getstr t_line, buf, i3 : i3 += strsize ; if strsize = 0 : break if t_line = "%index" { getstr t_ture, buf, i3 if t_ture ! "システムの許容範囲" & t_ture ! "Error Message" { if (gsa_size - i2) < strsize { // 残りサイズ < 書き込む量 gsa_size += strsize + 1024 memexpand gsa, gsa_size // gsa を大きくする } poke gsa, i2, t_ture +"\n" i2 += strsize ; gsa += "\n"+ t_ture m_n@ ++ } } await 0 loop return ""+ gsa



tsuka

リンク

2008/12/2(Tue) 22:30:30|NO.21204

>レノスさん
なるほど
i3のことをすっかり忘れてました
それと、memexpandも必要なのですね・・・

これで一応完成しそうです

ありがとうございました



sssssssss

リンク

2008/12/3(Wed) 18:21:31|NO.21215

お前ら知ってる?
ここであーだこーだと高速化をやっていることを一般的には


小手先の高速化

と言うんですよ。



774

リンク

2008/12/3(Wed) 20:04:24|NO.21220

>お前ら知ってる?
>ここであーだこーだと高速化をやっていることを一般的には
>小手先の高速化
>と言うんですよ。

つ「なら君の考える、真の高速化手法を聞かせてほしい」



tsuka

リンク

2008/12/8(Mon) 20:21:29|NO.21422

>sssssssssさん
なるほど
そういう呼び方があるんですね

>774さん
高速化にも種類があるんですね・・・

ありがとうございました

#PCの不調が原因で返事が遅れてしまいました



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