#20 | 可変長文字列と固定長文字列を比較する | ||||||||||||||||
文字列型(String)の変数には「可変長文字列」と「固定長文字列」の2種類があります。あらかじめ型宣言で長さを指定する必要もなく、しかも最大で約2GBまでという、実質的には制限を考えることなく文字データを扱える可変長文字列と、"Dim strData As String * 20" というようにその長さの上限を決めた上で文字データを扱う固定長文字列です。
Dim strFixed As String * 4096 '固定長文字列を宣言 Dim strVariable As String '可変長文字列を宣言 Dim strTemp As String Dim iintLoop As Integer 'テスト回数のループカウンタ Const cintTestMax As Integer = 4000 'テスト回数 ts_Watch "テスト開始", True '短いテキストの代入********************* For iintLoop = 1 To cintTestMax strFixed = "1234" Next iintLoop ts_Watch "固定長への短いテキスト" For iintLoop = 1 To cintTestMax strVariable = "1234" Next iintLoop ts_Watch "可変長への短いテキスト" '長いテキストの代入********************* For iintLoop = 1 To cintTestMax strFixed = String$(4000, "A") Next iintLoop ts_Watch "固定長への長いテキスト" For iintLoop = 1 To cintTestMax strVariable = String$(4000, "A") Next iintLoop ts_Watch "可変長への長いテキスト" '文字列の結合********************* strFixed = "" For iintLoop = 1 To cintTestMax strFixed = strFixed & "A" Next iintLoop ts_Watch "固定長の文字列結合" strVariable = "" For iintLoop = 1 To cintTestMax strVariable = strVariable & "A" Next iintLoop ts_Watch "可変長の文字列結合" '部分文字列の取り出し********************* strTemp = String$(4000, "A") For iintLoop = 1 To cintTestMax strFixed = Mid$(strTemp, 2000, 100) Next iintLoop ts_Watch "固定長の文字列取り出し" strVariable = String$(4000, "A") For iintLoop = 1 To cintTestMax strVariable = Mid$(strTemp, 2000, 100) Next iintLoop ts_Watch "可変長の文字列取り出し" そして、テスト結果はつぎのようなものになりました。 最初の推測は完全に覆されてしまいました。まったく反対の結果で、すべてのテストについて固定長文字列よりも可変長文字列の方がパフォーマンスが高いことは明らかです。残念ながら、どのような内部動作が理由でこのようになるのかは分かりません(勉強不足です)。しかし、可変長文字列は、文字列の長さを気にせず扱えかつ固定長文字列よりも高速な処理が可能な、大変都合のよいデータ型であることは確かなようです。そして、固定長文字列は、構造体(レコード型変数)やWindowsAPIの引数など、どうしても必要なところだけで使うようにするのがよいといえるでしょう。最後に、今回のテストからの教訓・・・・・・勝手な想像でパフォーマンスの良し悪しを決め付けてはいけない!。 |
|||||||||||||||||
|
Copyright © T'sWare All rights reserved |