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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1101
セントラル処理を高速化したい6解決


セントラル

リンク

2006/11/1(Wed) 20:44:22|NO.3208

下記のスクリプトを実行すると
(サンプルなので下記のスクリプトは全く意味が無いです)
かなり時間がかかってしまいます。
フリーズ防止のためにwait 1を入れていますがそれを抜いてもかなり遅いです。
この処理を高速化するにはどうすればいいでしょうか。
あるていど大きなファイルを読み込むことを想定しています。

dialog "*.*",16 filename=refstr exist filename mysize=strsize sdim ma,mysize bload filename,ma dim a,256 repeat 256:a(cnt)=cnt:loop repeat mysize poke ma,cnt,a(peek(ma,cnt)) wait 1 redraw 0 color 255,255,255:boxf:pos 0,0 color:mes ""+(double(cnt)/mysize*100)+"%" redraw 1 loop stop



この記事に返信する


ななし@HSP3掲示板

リンク

2006/11/1(Wed) 21:26:38|NO.3209


if cnt \ 10 { await 0 redraw 0 color 255,255,255:boxf:pos 0,0 color:mes ""+(double(cnt)/mysize*100)+"%" redraw 1 }
・描画処理を何回に一回かにする
・boxfは描画部分だけにする
 最初にpos 0,0:mes ""+(0.0/mysize*100)+"%"→mesxy = ginfo_mesx, ginfo_mesy
 で boxf 0,0,mesx,mesy とか
とか



セントラル

リンク

2006/11/2(Thu) 16:55:46|NO.3229

それをやってみましたが、やはりまだ遅いです…。
pokeの部分で何か早くする方法がないのでしょうか…。



山田 雄己

リンク

2006/11/2(Thu) 20:09:40|NO.3231

まったく意味の無いスクリプトを高速化したいといわれても難しいです。
pokeが遅いのであればpokeを使わないしか方法はありませんが、
目的がわからなければpoke以外の何が使えるのかもわかりません。

とりあえず今回の場合 poke の高速化は不要だと思います。
なぜなら poke にかかっている時間はこの処理全体の高々 0.1 % 程度に過ぎないからです。
poke をどんなにすごい未来の技術を使用して高速化しても、1000分の1も速くなりません。

本当に遅いのは画面の描画部分です。
ためしに

repeat mysize
poke ma,cnt,a(peek(ma,cnt))
loop

これだけで実行してみてください。
かなり速いはずです。

途中経過も表示したいならななしさんのようにするしかありませんが、
ななしさんのスクリプトは1行目に問題があるので効果が薄いです。

if cnt \ 10 = 0 {

とするか、もっと速くしたければ

if cnt \ 1000 = 0 {

としてみてください。
それでも最初の poke 行だけのものよりもかなり遅いです。
poke 自体の処理速度が速すぎて if の条件判断にかかる時間が馬鹿にならないからです。



あげなす

リンク

2006/11/2(Thu) 20:26:13|NO.3232

HSPはもともとC等と比べると遅い言語
(とはいっても普通の場合はそこまで気にならない程度ですが。)
であって、やはり大きな処理の場合はストレスを感じてしまうほど遅い場合があります。
そこまで速度を追求したいのなら、やはりプラグイン等を使用するか、
いっそ他の言語でソフトを開発してしまうことをお勧めします。
また完全にwaitを抜いてしまうと作業を中断したい時などに困りますので、
gettime等で現在の秒数を監視して、1秒毎にawaitなどを入れるといった感じにした方が
よいかと思います。



ナナポポ

リンク

2006/11/2(Thu) 22:44:19|NO.3234

objprmを使用したら速くなりましたよ。

dialog "*.*",16 test=0 font "",25,0 objmode 2,0 input test,150,50,10 filename=refstr exist filename mysize=strsize sdim ma,mysize bload filename,ma dim a,256 repeat 256:a(cnt)=cnt:loop repeat mysize poke ma,cnt,a(peek(ma,cnt)) if cnt\1000=0 : objprm 0,double(cnt)/mysize*100 : wait 1 ;ループ1000回毎に描画処理&ウェイト loop stop



セントラル

リンク

2006/11/7(Tue) 21:55:48|NO.3296

画面に描画する処理をなくせば早くなるのは知りませんでした。
特に重要というわけでもないので、画面の描画は無しにします。
ありがとうございました。



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