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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top