2007/06/14(Thu) 16:30:47 編集(投稿者)
VB6 の高速化コード集。
可読性に難のあるコードも多いので、使いどころに注意。
http://www.xbeat.net/vbspeed/
■No4350 (mあ さん) に返信
>>記事の内容を読み違えているような……。
> 読み違えています?バッファリングのことだと認識していたのですが・・・
バッファです。バッファなんですが、記事中で書かれていた内容は、
『32000 を指定すると高速アクセスできる。』
『関数内で合計 65000 程度のバッファしか確保できない。』
であって、
「32000 〜 65000 の範囲を指定することで、書き込み処理を高速化出来る」
では無いと思いますよ。
元の記事にもヘルプにも、65000 という値を Len に指定できるとは
書かれていませんし、実際に指定すると、実行時エラーとなりましたから。
> ノンバッファリングの Print があるってことですか?
> VB の書き込みはバッファリング無しが基本なんですか?
文字列連結の話は、たとえば
Set RS = Con.Execute(SQL)
Do Until RS.EOF
S = S & RS.Collect("ID") & ","
RS.MoveNext
Loop
Print #f, S;
のような書き方をすると低速であり、
Set RS = Con.Execute(SQL)
Do Until RS.EOF
Print #f, RS.Collect("ID") ","
RS.MoveNext
Loop
の方が結果的には高速であった…という話です。
もっとも、Recordset のテキスト化なら、GetString メソッドを併用した方が早いですけれどね。
でもって、Mid ステートメントの件は:
------------
Dim S As String
S = "aaa"
Debug.Print StrPtr(S), "["; S; "]"
S = S & "bbb"
Debug.Print StrPtr(S), "["; S; "]"
S = "aaa "
Debug.Print StrPtr(S), "["; S; "]"
Mid(S, 4) = "bbb"
Debug.Print StrPtr(S), "["; S; "]"
------------
後者(Midステートメント)では、同じアドレスがそのまま使われていることを確認できますが、
前者(& 演算子)では、文字列処理の前後で、変数のアドレスが変更されていることがわかります。
これは単純に連結すると、新たな文字列領域の確保・複写・元の領域の破棄が行われるためです。
そのため文字列が長くなればなるほど、加速度的に処理時間がかかるようになります。
Mid ステートメントは、最初に確保した文字列領域内を書き換える形で動作するので、
メモリの再確保等が行われず、高速に処理される…という話ですね。