AB424の処理速度がおそくなってくる???

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Bez

AB424の処理速度がおそくなってくる???

#1 投稿記事 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
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#2 投稿記事 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の方が少し早く描画できるかな?とか、試行錯誤すべきものはあります。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
Bez

ありがとうございます。

#3 投稿記事 by Bez »

MID$()がどんどん処理速度が遅くなっていく原因だということがわかりました。
教えていただいたように、ポインタを使って処理できるように練習します。

しかし、実行中にどんどん遅くなっていく理由は私にはわかりそうにないですね。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#4 投稿記事 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を消しておく必要がありますが。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
Bez

ABの処理速度について

#5 投稿記事 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
返信する