文字列連結には
(1).objTxtFile.Writeを連発する
(2).&(アンパサンド)で全て繋ぐ
のどちらを行ったほうが、速く処理出来るのでしょうか?
http://download.microsoft.com/download/winscript56/Install/5.6/W...
上記は、ダミー(Windows Script 5.6 ドキュメント)です。
普通考えたら、&でつなぐほうが早いだろうと思って、計測してみました。
やっぱり、&でつなぐほうが早いです。
' Test1.vbs
Dim fso, f, StartTime, EndTime, str
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("c:\test1.txt", 2, True)
StartTime = Timer
str = ""
for i = 0 to 1000000
str = "a" & vbCrLf
Next
f.Write(str)
f.Close
EndTime = Timer
Wscript.Echo (EndTime - StartTime)
' EndTime - StartTime = 0.6875秒
'Test2.vbs
Dim fso, f, StartTime, EndTime
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("c:\test1.txt", 2, True)
StartTime = Timer
for i = 0 to 1000000
f.Write("a" & vbCrLf)
Next
f.Close
EndTime = Timer
WScript.Echo (EndTime - StartTime)
' EndTime - StartTime = 5.25秒
http://support.microsoft.com/default.aspx?scid=kb;ja;307340
ASP.NETでの現象ですが、文字列連結はパフォーマンスがよくありません。
文字列連結は非効率な方法として知られています。文字列連結には、およそ "l * n * n" の数のコピーが必要です。"l" は文字列の平均の長さを示し、"n" は結合される部分文字列の数を示します。"n" の値が大きいと、実行中のアプリケーションの処理速度が大幅に低下するだけでなく、CPU とヒープ メモリの使用量も増加します。
一つ一つのテキストが十分な大きさがあれば(1)の方が高速になるでしょう。
あくまでVBScriptですので、StringBuffer・StringBuilderのような手段が無い中で少しでも速く、という事になります。
説明不足で申し訳ないです。
http://download.microsoft.com/download/winscript56/Install/5.6/W...(ダミー)
すいません、間違えましたm(_ _)m
×str = "a" & vbCrLf
○str = str & "a" & vbCrLf
で、もう一度計測した結果、
test1.vbs:57.0625秒(文字列を連結する方法)
test2.vbs:0.515625秒(都度、Writeで書き込む方法)
(めちゃくちゃ時間がかかったので、どちらも桁を一つ落としました)
結果、逆になってしまいました。
で、Join関数を使う方法も試してみました。
'Test3.vbs
Dim fso, f, StartTime, EndTime, str(100000)
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile("c:\test3.txt", 2, True)
StartTime = Timer
for i = 0 to 100000
str(i) = "a" & vbCrLf
Next
f.Write(Join(str, ""))
f.Close
EndTime = Timer
Wscript.Echo (EndTime - StartTime)
' EndTime - StartTime = 0.109375秒
test3.vbs:0.109375秒(Join関数を使う方法)
結局、Join関数を使うのが、最も早くなりました。
今度は、書き込んだファイルを比較して、同じファイルになっていることを確認したので、あってるはずです。
文字列操作って時間がかかるんですね~。
勉強になりました。
(ちゃんと確認してから書き込まなきゃいけないということも、トホホ(T_T))
なるほど、Joinがありましたね。
回答有難う御座いました。
3.として
Dictionaryにaddしてjoinはどうでしょう。
DISKアクセスも一回ですむので、文字列の大量の連結を行う場合この手法を使ってます。
urlダミー
回答有難う御座いました。
わざわざサンプルまで作って頂いて、有難う御座いました。