下面的代码显示我(我认为)“for each”循环比“i to n”循环快10%,但“for each”循环在新内存中创建567k?这是正确的吗?哪种方式在速度和内存使用方面通常最有效?
如果您想在VB中运行此代码,只需在表单中添加一个按钮和2个标签。
Public Class StateObject
Public WorkSocket As String = "FFFFFFFFFFFF"
Public BufferSize As Integer = 32767
Public Buffer(32767) As Byte
End Class
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For cnt As Integer = 1 To 250
Dim StateObjecter As New StateObject
ClientNetList.Add(cnt.ToString, StateObjecter)
Next
End Sub
Private ClientNetList As New SortedList(Of String, StateObject)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim stop1 As New Stopwatch
Dim stop2 As New Stopwatch
Dim TotalMemory1 As Integer = GC.GetTotalMemory(False)
stop1.Start()
For cnt As Integer = 1 To 1000000
For i = 0 To ClientNetList.Count - 1
ClientNetList.Values(i).WorkSocket = "FFF"
Next
Next
stop1.Stop()
Dim TotalMemory2 As Integer = GC.GetTotalMemory(False)
MsgBox(TotalMemory2 - TotalMemory1)
TotalMemory1 = GC.GetTotalMemory(False)
Dim fff As Integer = GC.GetGeneration(ClientNetList)
stop2.Start()
For cnt As Integer = 1 To 1000000
For Each ValueType As StateObject In ClientNetList.Values
ValueType.WorkSocket = "FFF"
Next
Next
stop2.Stop()
Dim ffff As Integer = GC.GetGeneration(ClientNetList)
TotalMemory2 = GC.GetTotalMemory(False)
MsgBox(TotalMemory2 - TotalMemory1)
Label1.Text = "i: " & stop1.ElapsedMilliseconds
Label2.Text = "e: " & stop2.ElapsedMilliseconds
End Sub
答案 0 :(得分:1)
在我的系统上,第一次测试(第一次点击程序运行按钮)的“for i = 1”循环速度提高了约20%。但是“for each”循环在随后的测试中更快。 “for each”循环占用了更多的内存,但这是暂时的,最终将被垃圾收集。
“for each”和“for i =”的利弊在这里一直争论不休。对于每个都很好,因为它适用于除数组之外的结构,并使对象可用。 “For i =”具有在循环中指定数组项的边界和顺序的优点,并避免了数组中可能遇到的错误:
Dim a(50) As Integer
Dim i As Integer
For Each i In a
i = 22
Next i
在这个例子中,数组永远不会初始化为22.变量i只是数组元素的副本,当i被赋值为22时,原始数组元素不会改变。