2012年12月6日木曜日

Redim Preserve なんてあったなー

これは Visual Basic Advent Calendar 2012 の記事です。

VBならではの構文の一つに Redim Preserve という配列の再確保と再定義を行うものがあります。コレクションクラス全盛である今では、ほとんど使う機会もないものです。

ひょっとするとレスポンス的に問題があるのかな、などと不意に思ったので調べてみました。


   1:      Sub Main()
   2:   
   3:          Dim tm As DateTime = Nothing
   4:   
   5:          Dim ar2 As New ArrayList(0)
   6:          ar2.Add(0)
   7:          tm = Now
   8:          For cnt = 1 To 10000
   9:              ar2.Add(cnt)
  10:          Next
  11:          For cnt = 1 To 10000
  12:              Console.Write(ar2(cnt).ToString + " ")
  13:          Next
  14:          Dim tm2 = Now - tm
  15:   
  16:          Dim ar1(0) As Integer
  17:          ar1(0) = 0
  18:   
  19:          tm = Now
  20:          For cnt = 1 To 10000
  21:              ReDim Preserve ar1(ar1.Max + 1)
  22:              ar1(cnt) = cnt
  23:          Next
  24:          For cnt = 1 To 10000
  25:              Console.Write(ar1(cnt).ToString + " ")
  26:          Next
  27:          Dim tm1 = Now - tm
  28:   
  29:          Console.WriteLine("")
  30:          Console.WriteLine("Preserve :" + tm1.ToString)
  31:          Console.WriteLine("Array :" + tm2.ToString)
  32:   
  33:          Console.ReadLine()
  34:      End Sub



こんな感じのテストロジックを使って試してみたところ、Preserve を使った場合は「ほんの若干」遅い程度で、ArrayList とほぼ同様のレスポンスを発揮していました。

image

何度か試してみたところ、スコアにそれほどの変換は現れませんでしたので、ほぼ同じ程度のレスポンスと考えてよいかと思います。

ただし。

Preserve を利用した場合、初回のタイミングでガクンと負荷がかかるというか、レスポンスが悪くなります。それはもう体感できるレベルですので、今の時点では利用する必要は全くないのではないかな、と思いました。

0 件のコメント:

コメントを投稿