Was ist die effizienteste Methode für in VB 2008 durch eine SortedList Looping?
-
08-07-2019 - |
Frage
Der folgende Code zeigt mir (glaube ich), dass die „für jede“ Schleife ist ca. 10% schneller als die „i n“ Schleife, aber die „für jeden“ Schleife erzeugt 567k in neuen Speicher? Ist das richtig? Welcher Weg ist in der Regel am effizientesten in Bezug auf Geschwindigkeit und Speicherverbrauch?
Wenn Sie diesen Code in VB laufen fügen Sie einfach einen Knopf und 2 Etiketten in eine Form.
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
Lösung
Auf meinem System die „für i = 1“ Schleife war schneller für den ersten Test (der erste Klick auf die Schaltfläche des Programmablaufs) um etwa 20 Prozent. Aber die „für jede“ Schleife war ein Haar schneller auf nachfolgenden Tests. Die „für jede“ Schleife nahm ein wenig mehr Speicher, aber das ist nur vorübergehend und schließlich Müll gesammelt werden.
Die Vor- und Nachteile von „für jeden“ und „für i =“ wurden hier diskutiert. Für jeden ist schön, weil es mit anderen Strukturen als Arrays arbeitet, und macht ein Objekt zur Verfügung. „Für i =“ hat den Vorteil, die Grenzen und die Reihenfolge der Array-Elemente in der Schleife bezeichnet, und vermeidet einen Fehler, den Sie mit Arrays auftreten können:
Dim a(50) As Integer
Dim i As Integer
For Each i In a
i = 22
Next i
In diesem Beispiel wird das Array nie initialisiert bis 22. Die Variable i ist nur eine Kopie eines Array-Elements und das ursprüngliche Array-Element wird nicht geändert, wenn ich 22 zugeordnet ist.