|
 |
|
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
|
|
2008/12/1(Mon) 18:37:04|NO.21167
最後のところ間違えてました
正しくは
if stat=6 :dialog "*",17 :notesel naiyo :notesave refstr
でした
|
|
2008/12/1(Mon) 18:47:15|NO.21168
とりあえず、wait 1をawait 1にしてみたら?
|
|
2008/12/1(Mon) 19:02:35|NO.21169
titleは時間かかるので、mesを使うようにすると良いかもです。
|
|
2008/12/1(Mon) 19:59:30|NO.21172
>aさん
await 1だと余計に遅くなった気がします
await 0なら高速になりました
>hspailさん
titleって時間がかかるんですね・・・
これからはできるだけmesを使うようにします
ありがとうございました
|
|
2008/12/1(Mon) 20:29:51|NO.21175
一応報告を・・・
mesを使ってやってみたのですが、mesだけだととても速くなりますが、(titleの16倍ほど速くなる
ちらつきを消すためにredrawを使うととても遅くなってしまいます(titleの約5倍ほどの時間がかかる
なのでtitleを使うことにします
|
|
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 しきってから表示するか、メッセージで最大文字数をいじくるかしないと
数十個の命令しか表示できないはず……? ( 自分だけかもしれない )
|
|
2008/12/1(Mon) 22:26:17|NO.21179
>pさん
画面表示無くすとすごい速くなるんですね
進行情報とファイル名だけを表示してみようか、と思います
>レノスさん
たくさんのアドバイスありがとうございます
参考にします
ちなみに私の環境だと、1545個の命令は表示されました
ありがとうございました
|
|
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への代入がうまくいかないのです・・・

| |
|
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
|
|
2008/12/2(Tue) 02:25:53|NO.21189
>dir=getpath(refstr,32)
>chdir dir
よく考えたら要りませんね。
dialogでchdirされます。
|
|
2008/12/2(Tue) 08:53:33|NO.21193
>ちらつきを消すためにredrawを使うととても遅くなってしまいます
redraw で余計な部分も更新していませんでしたか?
高速化したいのであれば、redraw命令のときに対象となる領域を指定しましょう。
指定しなかった場合、画面全体を更新してしまいます。これは遅いです。
|
|
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
|
|
2008/12/2(Tue) 22:30:30|NO.21204
>レノスさん
なるほど
i3のことをすっかり忘れてました
それと、memexpandも必要なのですね・・・
これで一応完成しそうです
ありがとうございました
|
|
2008/12/3(Wed) 18:21:31|NO.21215
お前ら知ってる?
ここであーだこーだと高速化をやっていることを一般的には
小手先の高速化
と言うんですよ。
|
|
2008/12/3(Wed) 20:04:24|NO.21220
>お前ら知ってる?
>ここであーだこーだと高速化をやっていることを一般的には
>小手先の高速化
>と言うんですよ。
つ「なら君の考える、真の高速化手法を聞かせてほしい」
|
|
2008/12/8(Mon) 20:21:29|NO.21422
>sssssssssさん
なるほど
そういう呼び方があるんですね
>774さん
高速化にも種類があるんですね・・・
ありがとうございました
#PCの不調が原因で返事が遅れてしまいました
|
|