VBScriptにて、文字列連結を大量に行うテキストファイルを作成する場合、

文字列連結には
(1).objTxtFile.Writeを連発する
(2).&(アンパサンド)で全て繋ぐ
のどちらを行ったほうが、速く処理出来るのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/06/12 21:01:21
  • 終了:2006/06/12 23:25:09

回答(4件)

id:mitou73 No.1

mitou73回答回数67ベストアンサー獲得回数52006/06/12 21:29:34

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秒

id:litetuna

わざわざサンプルまで作って頂いて、有難う御座いました。

2006/06/12 21:56:13
id:tomo_k No.2

tomo_k回答回数426ベストアンサー獲得回数262006/06/12 21:38:42

ポイント50pt

http://support.microsoft.com/default.aspx?scid=kb;ja;307340

ASP.NETでの現象ですが、文字列連結はパフォーマンスがよくありません。

文字列連結は非効率な方法として知られています。文字列連結には、およそ "l * n * n" の数のコピーが必要です。"l" は文字列の平均の長さを示し、"n" は結合される部分文字列の数を示します。"n" の値が大きいと、実行中のアプリケーションの処理速度が大幅に低下するだけでなく、CPU とヒープ メモリの使用量も増加します。

一つ一つのテキストが十分な大きさがあれば(1)の方が高速になるでしょう。

id:litetuna

あくまでVBScriptですので、StringBuffer・StringBuilderのような手段が無い中で少しでも速く、という事になります。

説明不足で申し訳ないです。

2006/06/12 21:55:30
id:mitou73 No.3

mitou73回答回数67ベストアンサー獲得回数52006/06/12 23:10:41

ポイント100pt

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))

id:litetuna

なるほど、Joinがありましたね。

回答有難う御座いました。

2006/06/12 23:22:31
id:cara2000 No.4

cara2000回答回数4ベストアンサー獲得回数02006/06/12 22:48:37

ポイント50pt

3.として

Dictionaryにaddしてjoinはどうでしょう。

DISKアクセスも一回ですむので、文字列の大量の連結を行う場合この手法を使ってます。

http://google.com

urlダミー

id:litetuna

回答有難う御座いました。

2006/06/12 23:22:49

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません