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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0328
prince文字列の検索について4解決


prince

リンク

2015/3/28(Sat) 16:23:58|NO.68189

自動補完ソフトを作っていて、以下のコードは補完候補を表示するものです。

//一時バッファ buf = "" //検索する文字 token = "note" : input token //検索結果 sdim list, 64, 6 //テキスト読み出し(12KB程) notesel dic : noteload "dic.txt" repeat n = 0 foreach list list(cnt) = "" loop //すべての行を検索 repeat notemax //cnt行目をバッファに読み出し noteget buf, cnt //最初の文字がtokenだったら("note"で始まる文字列だったら) if instr(buf, 0, token) == 0 { //リストに見つかった順に代入 list(n) = buf //5回見つかったらそれ以上は探さない if n == 5 : break n++ } loop //結果表示 redraw 0 color 255,255,255 : boxf color : pos 0,30 foreach list mes list(cnt) loop redraw 1 wait 2 //20ミリ秒待機 loop
dic.txtは、長いので別サイトにあります。HSP3.4の標準命令をリストにしたものです。
http://codepad.org/0JNSInDP
20ミリ秒待機させているのですが、(常駐ソフトとしては)CPUの負荷が高めで私の環境では6〜7%でした。
どこか改善できるところはないでしょうか?

3.5beta2ではnotefindという関数が追加されるらしく、それを使えば少し軽くなるかもしれませんが…



この記事に返信する


m

リンク

2015/3/28(Sat) 17:22:35|NO.68192

この場合の重い原因は「常にキーワード検索が走り続けている」からです。
基本的には「入力されたキーワードが変わらなければ出力を書き換える必要が無い」なので、
キーワードが変更されたかどうかを調べて処理すると大分軽くなります。

repeatで監視する場合は直前のトークンを保持しておき、比較して変更されたかどうかを調べます。

repeat wait 2 if token == token_old : continue token_old = token // ここから出力処理 loop
常駐プログラムの場合は onkey でキー入力があったら変更されたと判断する方が負荷が低くなります。

buf = "" token = "note" : input token sdim list, 64, 6 notesel dic : noteload "dic.txt" onkey goto *SEARCH_KEYWORD *SEARCH_KEYWORD n = 0 foreach list list(cnt) = "" loop repeat notemax noteget buf, cnt if instr(buf, 0, token) == 0 { list(n) = buf if n == 5 : break n++ } loop redraw 0 color 255,255,255 : boxf color : pos 0,30 foreach list mes list(cnt) loop redraw 1 stop



暇人

リンク

2015/3/28(Sat) 18:34:14|NO.68193

検索元が変更された時だけ検索開始して
全体を検索して一つ目を見つけるように処理軽減


//検索する文字 token = "note" : input token //検索結果 sdim list, 64, 6 //テキスト読み出し(12KB程) notesel dic : noteload "dic.txt" //誤検索しないように辞書を加工(命令名の前にTabを入れる) strrep dic,"\n","\n " noteget buf, 0 noteadd " "+buf,0,1 repeat repeat await 5 if token ! token_bak {break} loop token_bak=token total_index=0 n=6 repeat n index=instr(dic, total_index, " "+token) //Tab付きで検索して必ず先頭から一致する命令名だけにする if index>=0 { total_index+index+1 //Tabを省くために1バイト進ませる getstr list(cnt),dic,total_index total_index+strsize }else{ n=cnt //制限に満たないなら見つかった分だけをセット break } loop //結果表示 redraw 0 color 255,255,255 : boxf color : pos 0,30 repeat n mes list(cnt) loop redraw 1 loop



ht_ask

リンク

2015/3/28(Sat) 18:43:20|NO.68194

現時点で候補となっている単語のリストを別に作って絞り込むとなおいいですね。
本来はレッドブラックツリーを作りたいところですがHSPでは困難かも。



prince

リンク

2015/3/29(Sun) 08:55:05|NO.68202

ありがとうございます。とても軽くなりました。



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