Quelle est la méthode la plus efficace pour parcourir une liste SortedList dans VB 2008?

StackOverflow https://stackoverflow.com/questions/1641389

  •  08-07-2019
  •  | 
  •  

Question

Le code ci-dessous me montre (je pense) que le "pour chaque" la boucle est environ 10% plus rapide que le "i à n" boucle, mais le " pour chaque " boucle crée 567k dans une nouvelle mémoire? Est-ce correct? Quel est le moyen le plus efficace en termes de vitesse et d’utilisation de la mémoire?

Si vous souhaitez exécuter ce code en VB, ajoutez simplement un bouton et 2 étiquettes à un formulaire.

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
Était-ce utile?

La solution

Sur mon système, le "pour i = 1" La boucle était plus rapide d'environ 20% lors du premier test (premier clic du bouton du programme exécuté). Mais le " pour chaque " la boucle était plus rapide lors des tests suivants. Le " pour chaque " La boucle a pris un peu plus de mémoire, mais ceci est temporaire et sera éventuellement ramassé.

Le pour et le contre de "pour chaque" et " pour i = " ont été débattus ici. Pour chacun, c’est bien parce qu’il fonctionne avec des structures autres que des tableaux et rend un objet disponible. " Pour i = " a l'avantage de désigner les limites et l'ordre des éléments de tableau dans la boucle et évite les problèmes que vous pouvez rencontrer avec les tableaux:

Dim a(50) As Integer
Dim i As Integer
For Each i In a
  i = 22
  Next i

Dans cet exemple, le tableau n'est jamais initialisé à 22. La variable i est simplement une copie d'un élément de tableau et l'élément de tableau d'origine n'est pas modifié lorsque i est affecté à 22.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top