ページ 1 / 1
AB424の処理速度がおそくなってくる???
Posted: 2007年3月02日(金) 22:48
by Bez
AB初心者です。
次のプログラムは、
配列の1234番目を入れ替えるというプログラムの作成中のものです。
処理速度はずっと変わらないはずだと思うのですが、
実際のところ、どんどん遅くなります。
2000回ぐらいループさせると症状がよくわかります。
他の同じ作業をするプログラムは一定の処理速度でした。
文字を使うとどうも遅くなるようです。
対応策がありましたら、教えてください。
コード: 全て選択
#prompt
dim m(6)=[0,1,2,3,-4,5,6] as double
dim i as long
dim lp as long
dim e as long
dim buf as double
dim pat as string
for lp=1 to 2000
print lp;" ";Time$()
pat="1234"
e=len(pat)
buf=m(Val(Mid$(pat,e,1)))
for i=e to 2 step -1
m(Val(Mid$(pat,i,1)))=m(Val(Mid$(pat,i-1,1)))
Next
m(Val(Mid$(pat,1,1)))=buf
Next
Posted: 2007年3月03日(土) 11:00
by konisi
まず、重いMid$関数を消す。
コード: 全て選択
#prompt
dim m(6)=[0,1,2,3,-4,5,6] as double
dim i as long
dim lp as long
dim e as long
dim buf as double
dim pat as string
'ループ内で一度も変わらないものは外に追い出す
'(当たり前のことなので、こういう時に気付くように。)
pat="1234"
e=len(pat)
'Mid$関数が重くなる原因なので、ちょっと改良
for lp=1 to 2000
debug
print lp;" ";Time$()
buf=m(pat(e-1)-48)
for i=e to 2 step -1
m(pat(i-1)-48)=m(pat(i-2)-48)
Next
m(pat(0)-48)=buf
Next
さらに、計算回数を減らす処理を使う。
コード: 全て選択
#prompt
dim m(6)=[0,1,2,3,-4,5,6] as double
dim i as long
dim lp as long
dim e as long
dim buf as double
dim pat as string
pat="1234"
e=len(pat)
Dim dum As BytePtr
dum=calloc(e+1)
For i=1 To e+1
dum(i)=pat(i-1)-48
Next
for lp=1 to 2000
print lp;" ";Time$()
buf=m(dum(e))
for i=e to 2 step -1
m(dum(i))=m(dum(i-1))
Next
m(dum(1))=buf
Next
free(dum)
ほかにも、文字表示だけなら#consoleの方が少し早く描画できるかな?とか、試行錯誤すべきものはあります。
ありがとうございます。
Posted: 2007年3月03日(土) 12:03
by Bez
MID$()がどんどん処理速度が遅くなっていく原因だということがわかりました。
教えていただいたように、ポインタを使って処理できるように練習します。
しかし、実行中にどんどん遅くなっていく理由は私にはわかりそうにないですね。
Posted: 2007年3月03日(土) 14:09
by konisi
別に、eの値が不変なら、次のように書き換える事もできますよ。
コード: 全て選択
'e=4
Dim dum As BytePtr
dum=calloc(e+1)
For i=1 To e+1
dum(i)=pat(i-1)-48
Next
↓
コード: 全て選択
Dim dum(5) As Byte
For i=1 To e+1
dum(i)=pat(i-1)-48
Next
もちろんこう書き換えた時は、一番下の行のfreeを消しておく必要がありますが。
ABの処理速度について
Posted: 2007年3月03日(土) 22:56
by Bez
>konisiさんへ
この間書いていただいたソースで対応しています。問題はプログラムの機能を縮小することで対応できました。
私が一番不思議に思っていることは、アルゴリズムの悪さからのスピードの遅さではなくて、同じ計算量の処理を繰り返しているだけなのに、回数を重ねると
AB424の処理がだんだん遅くなっていくのです。
konishさんに書いていただいたソースでは遅くなる現象は見られないのですが、
下記のソースを実行していただくと、最初と2000回付近では処理の速度が違うことがお分かりいただけるかとおもいます。
AB262でも処理速度のテストしたいのですが、XPで動かす方法を忘れました・・・。
ちなみに下記のソースはルービックキューブを解くプログラムのサブルーチンの一部です。計算の結果、私のコンピュータでは3100年位かかるので、根本的に違うアルゴリズムを考え中です。
コード: 全て選択
#prompt
dim m(6)=[0,1,2,3,-4,5,6] as double
dim i as long
dim lp as long
dim e as long
dim buf as double
dim pat as string
for lp=1 to 2000
print lp;" ";Time$()
pat="1234" ←本当はランダムに長さと内容を変えます。
e=len(pat)
buf=m(Val(Mid$(pat,e,1)))
for i=e to 2 step -1
m(Val(Mid$(pat,i,1)))=m(Val(Mid$(pat,i-1,1)))
Next
m(Val(Mid$(pat,1,1)))=buf
Next