#21 | テキストボックスでの長い文字列を考える | |||||||||
すでに「#13 ループ内ではコントロールを参照しない方がよい? 」で試みたように、フォームのコントロールのプロパティ値を参照するには時間がかかります。ところで、プロパティにも変数や定数と同様にいくつかのデータ型があります。例えば、[Caption/標題]プロパティは文字列です。また、[Height/高さ]や[Width/幅]プロパティは数値です。数値の場合、データ型によってメモリサイズは異なるものの、極端に大きなメモリサイズ(数値の大きさではありません)はありませんが、文字列の場合には相当大きなサイズを扱う場合があります。その代表例がテキストボックスコントロールのデフォルトプロパティである[Value]プロパティでしょう。テキストボックスは何文字かのデータを入力したいようなときに多用するコントロールではありますが、テキストファイルの内容をまとめて読み込んで、表示・編集するような用途にも使えます。そしてそれらのデータを代入するのが[Value]プロパティです。
これらの3つのテストコードを次に示します。"txtFileData"がテキストボックスの名前です。 Private Sub cmdFileRead_Click() Dim lngFileNum As Long Dim strFileData As String Dim strTmpData As String Const cstrFileName As String = "d:\tmp\test.txt" ts_Watch "テスト開始", True 'Do〜Loopでファイルを1行ずつ読み込み、 '1行ずつテキストボックスのプロパティの後ろに連結 Me!txtFileData.Value = "" lngFileNum = FreeFile Open cstrFileName For Input As #lngFileNum Do Until EOF(lngFileNum) Line Input #lngFileNum, strFileData Me!txtFileData.Value = Me!txtFileData.Value & strFileData & vbCrLf Loop Close #lngFileNum ts_Watch "テスト1" '画面再描画を抑止 Echo False Me!txtFileData.Value = "" lngFileNum = FreeFile Open cstrFileName For Input As #lngFileNum Do Until EOF(lngFileNum) Line Input #lngFileNum, strFileData Me!txtFileData.Value = Me!txtFileData.Value & strFileData & vbCrLf Loop Close #lngFileNum Echo True ts_Watch "テスト2" 'Do〜Loopでファイルを1行ずつ読み込み、 '1行ずつ文字列型の変数の後ろに連結、 '最後にまとめてテキストボックスのValueプロパティにセット strTmpData = "" lngFileNum = FreeFile Open cstrFileName For Input As #lngFileNum Do Until EOF(lngFileNum) Line Input #lngFileNum, strFileData strTmpData = strTmpData & strFileData & vbCrLf Loop Close #lngFileNum Me!txtFileData.Value = strTmpData ts_Watch "テスト3" End Sub ※テキストボックスの値を取得する際に[Value]プロパティを明示的に記述していますが、 このプロパティはテキストボックスのデフォルトプロパティですので省略しても問題ありません。 テスト結果は次のようなものになりました。
数値を見ればお分かりのように、「コントロールのプロパティ値を参照するには時間がかかる」ということを再認識させられる結果となりました。テキストボックスの[Value]プロパティも一つの文字列型変数と考えれば、テストの1と3はまったく同じものと見ることができます。ところがご覧のように大きな時間差が出る結果となりました。このテストではテキストボックスに値をセットしている操作が中心のように思えますが、よく見ると分かりますが、実際には現在のテキストボックスのプロパティ値を参照してそれに文字列を結合、その結果を再セットする、という動作をさせています。つまり代入だけでなくコントロールの"参照"も同じ回数行っているのです。このことから、"コントロールという1つのオブジェクト"を参照する動作、オブジェクトからプロパティ値を取り出したりセットしたりする動作、これらは文字列型変数に対して参照・代入を行う場合と比較して、時間的に非常に大きなコストがかかるということがいえます。 lngFileNum = FreeFile Open cstrFileName For Binary As #lngFileNum Me!txtFileData.Value = Input(LOF(lngFileNum), #lngFileNum) Close #lngFileNum ts_Watch "テスト4" その結果は、3番目のテストの実に約10分の1、 1.8 秒でした。このことから、データベースへのアクセスも含めてディスクアクセスがいかなる場合もパフォーマンスのボトルネックになる、という認識が重要です。 |
||||||||||
|
Copyright © T'sWare All rights reserved |