人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VBScriptにて、文字列連結を大量に行うテキストファイルを作成する場合、
文字列連結には
(1).objTxtFile.Writeを連発する
(2).&(アンパサンド)で全て繋ぐ
のどちらを行ったほうが、速く処理出来るのでしょうか?

●質問者: litetuna
●カテゴリ:コンピュータ
✍キーワード:VBScript Write アンパサンド テキスト ファイル
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● mitou73
●0ポイント

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秒

◎質問者からの返答

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


2 ● tomo_k
●50ポイント

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

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

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

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

◎質問者からの返答

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

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


3 ● mitou73
●100ポイント

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がありましたね。

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


4 ● cara2000
●50ポイント

3.として

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

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

http://google.com

urlダミー

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ