Domanda

Il codice seguente mi mostra (penso) che il " per ogni " il loop è circa il 10% più veloce rispetto a & i; da n a & " loop, ma il " per ogni " loop crea 567k nella nuova memoria? È giusto? In che modo è generalmente più efficiente in termini di velocità e utilizzo della memoria?

Se vuoi eseguire questo codice in VB, aggiungi un pulsante e 2 etichette a un modulo.

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
È stato utile?

Soluzione

Sul mio sistema il " per i = 1 " il ciclo era più veloce per il primo test (il primo clic del pulsante del programma eseguito) di circa il 20 percento. Ma il " per ogni " loop era un pelo più veloce nei test successivi. Il " per ogni " loop ha richiesto un po 'più di memoria, ma questo è temporaneo e alla fine sarà spazzato via.

Pro e contro di " per ogni " e " per i = " sono stati discussi qui. Per ognuno è bello perché funziona con strutture diverse dalle matrici e rende disponibile un oggetto. " Per i = " ha il vantaggio di designare i limiti e l'ordine degli elementi dell'array nel ciclo ed evita un bug che si può incontrare con gli array:

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

In questo esempio, l'array non viene mai inizializzato su 22. La variabile i è solo una copia di un elemento dell'array e l'elemento dell'array originale non viene modificato quando mi viene assegnato 22.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top