2009-10-29 7 views
1

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

Si vous souhaitez exécuter ce code dans 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 
+0

Copie possible: http://stackoverflow.com/questions/472191/c-for-vs- foreach –

+0

Ce n'est pas un doublon ... ce fil ne mentionne même pas le mot mémoire. – SteveGSD

Répondre

1

Sur mon système la boucle « pour i = 1 » a été plus rapide pour le premier test (le premier clic du bouton de l'exécution du programme) d'environ 20 pour cent. Mais le "pour chaque" boucle était un cheveu plus rapide sur les tests suivants. La boucle "pour chaque" a pris un peu plus de mémoire, mais celle-ci est temporaire et sera finalement récupérée.

Les avantages et les inconvénients de "pour chaque" et "pour i =" ont été débattus ici. Car chacun est agréable car 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 du tableau dans la boucle, et évite un bug, vous pouvez rencontrer des tableaux:

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

Dans cet exemple, le tableau est jamais initialisé à 22. La variable i est juste une copie d'un élément de tableau, et l'élément de tableau d'origine n'est pas changé quand i est assigné à 22.

Questions connexes