ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 19:40

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2006年2月16日(木) 20:14 
<V4.20&4.21で Print#とInput# が低速不安定に>
V4.20時の投稿の続編です。V4.21でも状況が変わっていません。行数が多くてすみません。

文字列操作(Right$,Left$,Mid$)とファイル入出力(Print#,Input#)を繰返すテスト用コードと
その結果を報告します。下記コードをコンパイルしたexeファイルでのテスト結果です。

Print#とInput#が非常に低速かつ不安定です。(文字列操作に関しては有意差はありません)
繰返し回数を増やしていくとV4.20とV4.21は必ず死にます。
(「~のメモリを参照しました。メモリが"read"になることはできませんでした。」)
死ぬタイミングは一定していません。

V4.13では正常(10万回でも元気)なのに、V4.20&4.21では低速なだけでなく、繰返し回数を増して
いくと必ず死にます(500回程度でも死ぬことがあります)。
仕様というよりどこかに不具合があるように思われるのですが。

AB発展のために仕様としてN88BASIC系のコマンドが低速にならざるを得ないのでしょうか。
それにしても死んでしまうのは困ります。
そんなに繰返して実行することがあるの?という疑問はさておき、是非ご検討お願いします。

パソコンA(Pentium4 3GHz Windows2000)
!          !500回  500回  500回 !1000回 1000回 1000回 !2000回  2000回  2000回 !
!          !V4.13  V4.20  V4.21 !V4.13  V4.20  V4.21 !V4.13  V4.20  V4.21 !
!          !            !            !             !
!Right$ For~Next  !0.11 秒 0.109秒 0.094秒!0.219秒 0.219秒 0.203秒!0.422秒 0.422秒 0.438秒!
!Right$ Do~Loop  !0.109秒 0.109秒 0.109秒!0.203秒 0.203秒 0.219秒!0.438秒 0.438秒 0.421秒!
!Right$ While~Wend !0.11 秒 0.094秒 0.11 秒!0.219秒 0.219秒 0.219秒!0.422秒 0.422秒 0.438秒!
!          !            !            !             !
!Left$ For~Next  !0.093秒 0.094秒 0.109秒!0.218秒 0.219秒 0.219秒!0.437秒 0.437秒 0.422秒!
!Left$ Do~Loop   !0.11 秒 0.109秒 0.109秒!0.219秒 0.219秒 0.203秒!0.422秒 0.422秒 0.422秒!
!Left$ While~Wend !0.109秒 0.109秒 0.11 秒!0.203秒 0.203秒 0.204秒!0.437秒 0.438秒 0.438秒!
!          !            !            !             !
!Mid$  For~Next  !0.109秒 0.11 秒 0.109秒!0.219秒 0.218秒 0.218秒!0.422秒 0.437秒 0.437秒!
!Mid$  Do~Loop   !0.11 秒 0.109秒 0.11 秒!0.219秒 0.219秒 0.219秒!0.438秒 0.438秒 0.438秒!
!Mid$  While~Wend !0.109秒 0.109秒 0.109秒!0.218秒 0.219秒 0.219秒!0.422秒 0.421秒 0.437秒!
!          !            !            !             !
!Print# 数値 For~ !0.125秒 0.157秒 0.172秒!0.235秒 0.422秒 0.422秒!0.468秒 1.204秒 1.203秒!
!Print# 数値 Do~  !0.11 秒 0.265秒 0.25 秒!0.219秒 0.781秒 0.797秒!0.454秒 2.672秒 2.688秒!
!Print# 数値 While~!0.125秒 0.344秒 0.359秒!0.234秒 1.156秒 1.156秒!0.468秒 4.172秒 4.172秒!
!          !            !            !             !
!Print# 文字 For~ !0.109秒 0.344秒 0.328秒!0.219秒 1.141秒 1.125秒!0.422秒 4.125秒 4.109秒!
!Print# 文字 Do~  !0.109秒 0.406秒 0.407秒!0.218秒 1.391秒 1.391秒!0.438秒 5.141秒 5.156秒!
!Print# 文字 While~!0.11 秒 0.469秒 0.469秒!0.219秒 1.641秒 1.656秒!0.422秒 (死ぬ)  (死ぬ)!
!          !            !            !             !
!Input# 数値 For~ !0.125秒 1.015秒 1.016秒!0.25 秒 3.797秒 3.797秒!0.515秒         !
!Input# 数値 Do~  !0.14 秒 1  秒 1.015秒!0.266秒 3.797秒 3.828秒!0.516秒         !
!Input# 数値 While~!0.125秒 1.016秒 1.016秒!0.25 秒 (死ぬ) 3.797秒!0.515秒         !
!          !            !            !             !
!Input# 文字 For~ !0.125秒 0.937秒 0.953秒!0.25 秒     3.531秒!0.5 秒         !
!Input# 文字 Do~  !0.125秒 1.078秒 1.109秒!0.25 秒     4.031秒!0.5 秒         !
!Input# 文字 While~!0.125秒 1.203秒 1.203秒!0.25 秒     4.531秒!0.5 秒         !

パソコンA(Pentium4 2.53Hz WindowsXP)
!          !500回  500回  500回 !1000回 1000回 1000回 !2000回  2000回  2000回 !
!          !V4.13  V4.20  V4.21 !V4.13  V4.20  V4.21 !V4.13  V4.20  V4.21 !
!          !            !            !             !
!Right$ For~Next  !0.125秒 0.125秒 0.125秒!0.25 秒 0.25 秒 0.25 秒!0.5 秒 0.5 秒 0.5 秒!
!Right$ Do~Loop   !0.125秒 0.125秒 0.125秒!0.25 秒 0.25 秒 0.25 秒!0.515秒 0.516秒 0.516秒!
!Right$ While~Wend !0.125秒 0.125秒 0.125秒!0.25 秒 0.265秒 0.25 秒!0.5 秒 0.516秒 0.516秒!
!          !            !            !             !
!Left$ For~Next  !0.125秒 0.125秒 0.141秒!0.235秒 0.25 秒 0.25 秒!0.516秒 0.5 秒 0.5 秒!
!Left$ Do~Loop   !0.125秒 0.125秒 0.125秒!0.25 秒 0.25 秒 0.25 秒!0.5 秒 0.531秒 0.515秒!
!Left$ While~Wend !0.125秒 0.125秒 0.125秒!0.25 秒 0.266秒 0.25 秒!0.516秒 0.515秒 0.516秒!
!          !       !                 !             !
!Mid$  For~Next  !0.125秒 0.125秒 0.125秒!0.25 秒 0.25 秒 0.25 秒!0.515秒 0.516秒 0.515秒!
!Mid$  Do~Loop   !0.141秒 0.141秒 0.141秒!0.25 秒 0.266秒 0.266秒!0.5 秒 0.531秒 0.516秒!
!Mid$  While~Wend !0.125秒 0.125秒 0.125秒!0.266秒 0.265秒 0.25 秒!0.516秒 0.516秒 0.516秒!
!          !            !            !             !
!Print# 数値 For~  !0.14 秒 0.218秒 0.218秒!0.297秒 0.547秒 0.562秒!0.594秒 1.609秒 1.578秒!
!Print# 数値 Do~  !0.14 秒 0.344秒 0.344秒!0.297秒 1.047秒 1.063秒!0.594秒 3.609秒 3.593秒!
!Print# 数値 While~ !0.141秒 0.469秒 0.453秒!0.297秒 1.547秒 1.547秒!0.593秒 5.593秒 5.609秒!
!          !            !            !             !
!Print# 文字 For~  !0.141秒 0.437秒 0.453秒!0.266秒 1.532秒 1.5 秒!0.547秒 5.5 秒 5.5 秒!
!Print# 文字 Do~  !0.141秒 0.532秒 0.547秒!0.281秒 1.875秒 1.875秒!0.562秒 6.891秒 6.907秒!
!Print# 文字 While~ !0.14 秒 0.625秒 0.625秒!0.266秒 2.235秒 2.219秒!0.547秒 8.328秒 8.312秒!
!          !            !            !             !
!Input# 数値 For~  !0.156秒 1.359秒 1.344秒!0.328秒 5.094秒 5.109秒!0.656秒 19.657秒 19.734秒!
!Input# 数値 Do~  !0.156秒 1.36 秒 1.36 秒!0.328秒 5.125秒 5.093秒!0.657秒 19.657秒 20.015秒!
!Input# 数値 While~ !0.157秒 1.36 秒 1.36 秒!0.312秒 5.125秒 5.125秒!0.672秒 19.688秒 19.922秒!
!          !            !            !             !
!Input# 文字 For~  !0.156秒 1.265秒 1.25 秒!0.313秒 4.828秒 4.766秒!0.64 秒 18.297秒 19.469秒!
!Input# 文字 Do~  !0.156秒 1.437秒 1.437秒!0.328秒 5.469秒 5.5 秒!0.625秒 21.015秒 21.64 秒!
!Input# 文字 While~ !0.156秒 1.625秒 1.61 秒!0.312秒 6.172秒 6.156秒!0.625秒 23.765秒 25.906秒!

冒頭のバージョン行は不要行をコメント行にしてください。
'↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#prompt
Dim AV As String:AV="4.13" 'ActiveBasicバージョン
'Dim AV As String:AV="4.20" 'ActiveBasicバージョン
'Dim AV As String:AV="4.21" 'ActiveBasicバージョン
Dim T1 As Long '開始時刻
Dim NN As Long :NN=10000 '繰返し回数
Dim C1 As Long,C2 As Long,C3 As Long '表示桁数
C1=0:C2=40:C3=50
Dim TL As String 'タイトル
Dim LN As Long :LN=1 '表示行数
Dim I As Long,J As Long '汎用
J=1234567890
Dim II As String,JJ As String '汎用
JJ="1234567890"
'----------------------------------------------------------
Open "Report.txt" For Append As #2
TL="---ActiveBasic Ver"+AV+" によるテスト---"+Right$(Date$(),8)+" "+Time$()
Print TL :Print #2,String$(60,"=") :Print #2,TL
Input "繰返し回数(まずは 500で。1000位からV4.2xで死ぬ確率が増す):",NN
'==========================================================01
TL="Right$ For~Next     "+Str$(NN)+"回 "
LN=LN+2 :Locate C1,LN :Print TL :T1=GetTickCount()
For I=1 To NN
II=Right$(JJ,5):Locate C2,LN:Print I
Next I
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,"" :Print #2,TL+II
'----------------------------------------------------------02
TL="Right$ Do~Loop      "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL :T1=GetTickCount()
Do
II=Right$(JJ,5):I=I+1:Locate C2,LN:Print I
Loop Until I>=NN
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II
'----------------------------------------------------------03
TL="Right$ While~Wend    "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL :T1=GetTickCount()
While I<NN
II=Right$(JJ,5):I=I+1:Locate C2,LN:Print I
Wend
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II
'==========================================================04
TL="Left$  For~Next     "+Str$(NN)+"回 "
LN=LN+2 :Locate C1,LN :Print TL :T1=GetTickCount()
For I=1 To NN
II=Left$(JJ,5):Locate C2,LN:Print I
Next I
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,"" :Print #2,TL+II
'----------------------------------------------------------05
TL="Left$  Do~Loop      "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL :T1=GetTickCount()
Do
II=Left$(JJ,5):I=I+1:Locate C2,LN:Print I
Loop Until I>=NN
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II
'----------------------------------------------------------06
TL="Left$  While~Wend    "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL :T1=GetTickCount()
While I<NN
II=Left$(JJ,5):I=I+1:Locate C2,LN:Print I
Wend
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II
'==========================================================07
TL="Mid$  For~Next     "+Str$(NN)+"回 "
LN=LN+2 :Locate C1,LN :Print TL :T1=GetTickCount()
For I=1 To NN
II=Mid$(JJ,3,5):Locate C2,LN:Print I
Next I
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,"" :Print #2,TL+II
'----------------------------------------------------------08
TL="Mid$  Do~Loop      "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL :T1=GetTickCount()
Do
II=Mid$(JJ,3,5):I=I+1:Locate C2,LN:Print I
Loop Until I>=NN
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II
'----------------------------------------------------------09
TL="Mid$  While~Wend    "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL :T1=GetTickCount()
While I<NN
II=Mid$(JJ,3,5):I=I+1:Locate C2,LN:Print I
Wend
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II
'==========================================================10
TL="Print# 数値 For~Next  "+Str$(NN)+"回 "
LN=LN+2 :Locate C1,LN :Print TL
Open "Test.txt" For Output As #1
T1=GetTickCount()
For I=1 To NN
Print #1,J:Locate C2,LN:Print I
Next I
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,"":Print #2,TL+II:Close #1
'----------------------------------------------------------11
TL="Print# 数値 Do~Loop   "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL
Open "Test.txt" For Output As #1
T1=GetTickCount()
Do
Print #1,J:I=I+1:Locate C2,LN:Print I
Loop Until I>=NN
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II :Close #1
'----------------------------------------------------------12
TL="Print# 数値 While~Wend "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL
Open "Test.txt" For Output As #1
T1=GetTickCount()
While I<NN
Print #1,J:I=I+1:Locate C2,LN:Print I
Wend
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II :Close #1
'==========================================================13
TL="Print# 文字 For~Next  "+Str$(NN)+"回 "
LN=LN+2 :Locate C1,LN :Print TL
Open "Test.txt" For Output As #1
T1=GetTickCount()
For I=1 To NN
Print #1,JJ:Locate C2,LN:Print I
Next I
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,"":Print #2,TL+II:Close #1
'----------------------------------------------------------14
TL="Print# 文字 Do~Loop   "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL
Open "Test.txt" For Output As #1
T1=GetTickCount()
Do
Print #1,JJ:I=I+1:Locate C2,LN:Print I
Loop Until I>=NN
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II :Close #1
'----------------------------------------------------------15
TL="Print# 文字 While~Wend "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL
Open "Test.txt" For Output As #1
T1=GetTickCount()
While I<NN
Print #1,JJ:I=I+1:Locate C2,LN:Print I
Wend
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II :Close #1
'==========================================================16
TL="Input# 数値 For~Next  "+Str$(NN)+"回 "
LN=LN+2 :Locate C1,LN :Print TL
Open "Test.txt" For Input As #1
T1=GetTickCount()
For I=1 To NN
Input #1,J:Locate C2,LN:Print I
Next I
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,"":Print #2,TL+II:Close #1
'----------------------------------------------------------17
TL="Input# 数値 Do~Loop   "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL
Open "Test.txt" For Input As #1
T1=GetTickCount()
Do
Input #1,J:I=I+1:Locate C2,LN:Print I
Loop Until I>=NN
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II :Close #1
'----------------------------------------------------------18
TL="Input# 数値 While~Wend "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL
Open "Test.txt" For Input As #1
T1=GetTickCount()
While I<NN
Input #1,J:I=I+1:Locate C2,LN:Print I
Wend
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II :Close #1
'==========================================================19
TL="Input# 文字 For~Next  "+Str$(NN)+"回 "
LN=LN+2 :Locate C1,LN :Print TL
Open "Test.txt" For Input As #1
T1=GetTickCount()
For I=1 To NN
Input #1,JJ:Locate C2,LN:Print I
Next I
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,"":Print #2,TL+II:Close #1
'----------------------------------------------------------20
TL="Input# 文字 Do~Loop   "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL
Open "Test.txt" For Input As #1
T1=GetTickCount()
Do
Input #1,JJ:I=I+1:Locate C2,LN:Print I
Loop Until I>=NN
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II :Close #1
'----------------------------------------------------------21
TL="Input# 文字 While~Wend "+Str$(NN)+"回 "
LN=LN+1 :Locate C1,LN :I=0 :Print TL
Open "Test.txt" For Input As #1
T1=GetTickCount()
While I<NN
Input #1,JJ:I=I+1:Locate C2,LN:Print I
Wend
II=Str$((GetTickCount()-T1)/1000)+" 秒"
Locate C3,LN :Print II :Print #2,TL+II :Close #1
'==========================================================
TL="テストを終了しました。"
Locate C1,LN+2:Print TL :Print #2,"":Print #2,TL:Close #2
'↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑


通報する
ページトップ
   
投稿記事Posted: 2006年2月19日(日) 17:21 
オフライン

登録日時: 2006年2月05日(日) 17:10
記事: 215
お住まい: 東京都
たかせです。
不安定にはいたっていませんが。
実行速度がおそくなったことは確かです。
V4.13で1秒で実行できたものがV4.20,V4.21は15秒かかる場合もありました。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年3月07日(火) 02:14 
私もあまりの速度の違いにびっくりしています。(環境:WinXP/Sp2)
Ver4.13.00と比べるとそれ以降のVersionでは圧倒的に遅いです。
OPEN文を入れ子(複数個)に設定すると遅いような気がします。
以下に例を示します。

何かわかる方コメントお願いします。
コード:
#console

dim s$ as string
dim i as dword,j as dword
dim t0$ as string
dim t$ as string

t0$=Time$()
print t0$
open "test.txt" for output as #1
open "test2.txt" for output as #2

for i=1 to 10
	for j=1 to 1000
		print i,j
		print #1,i;i+1;i+2
		print #2,j;j+1;j+2
	Next
Next

close #1
close #2

t$=Time$()

temp$(1)=Mid$(t$,4,2)
temp$(2)=Mid$(t0$,4,2)
temp$(3)=Mid$(t$,7,2)
temp$(4)=Mid$(t0$,7,2)

print "所要時間",(Val(temp$(1))*60-Val(temp$(2))*60)+(Val(temp$(3))-Val(temp$(4)))

end


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年3月07日(火) 02:23 
前記code内において

dim temp$(10) as string

が抜けていました。
すみません。


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot] & ゲスト[14人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean