在封装数据库中经常使用会使用一些返回 Array 的 Property 来表示子表的抽象连接。
于是,对不同的使用方法作了一次测试
Public Class PropertySpeedTestClass
Public ReadOnly Property Ints() As Array
Get
Dim x As New ArrayList
Dim i As Integer
For i = 1 To 1000
x.Add(i)
Next
Return x.ToArray
End Get
End Property
End Class
对于同一个属性使用两种访问方法 ,竟然得到一个47倍的性能差异
方法1 直接访问 [47秒完成]
Public Sub TestForm1()
Dim i, m, n As Integer
n = Me.NumericUpDown1.Value - 1
Dim x As Integer
Dim tc As PropertySpeedTestClass = New PropertySpeedTestClass
Dim b As Date = Now
For i = 0 To n
For m = 1 To 1000
x = tc.Ints(i)
Next
If i Mod 200 = 0 Then
Label1.Text = "Over " & i
End If
Next
Label1.Text = DateDiff(DateInterval.Second, b, Now)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Button1.Enabled = False
Label1.Text = "In Testing........."
Dim test As New Thread(AddressOf Me.TestForm1)
test.Start()
Button1.Enabled = True
End Sub
方法2 利用Clone做一个缓冲区访问 [0.8秒完成]
Public Sub TestForm2()
Dim i, m, n As Integer
n = Me.NumericUpDown1.Value - 1
Dim x As Integer
Dim tc As PropertySpeedTestClass = New PropertySpeedTestClass
Dim b As Date = Now
For i = 0 To n
Dim temp As Array = tc.Ints.Clone
For m = 1 To 1000
x = temp(i)
Next
Next
Label2.Text = DateDiff(DateInterval.Second, b, Now)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Button2.Enabled = False
Label2.Text = "In Testing........."
Dim test As New Thread(AddressOf Me.TestForm2)
test.Start()
Button2.Enabled = True
End Sub
看来.net 的编译器还是不够聪明