Pregunta

El siguiente código me muestra (creo) que el " para cada " el bucle es aproximadamente un 10% más rápido que la "i to n" bucle, pero el " para cada " Loop crea 567k en nueva memoria? ¿Es esto correcto? ¿Cuál es la forma más eficiente en términos de velocidad y uso de memoria?

Si desea ejecutar este código en VB, simplemente agregue un botón y 2 etiquetas a un formulario.

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
¿Fue útil?

Solución

En mi sistema, " para i = 1 " el ciclo fue más rápido para la primera prueba (el primer clic del botón de ejecución del programa) en aproximadamente un 20 por ciento. Pero el " para cada " loop fue un pelo más rápido en las pruebas posteriores. El " para cada " el bucle tomó un poco más de memoria, pero esto es temporal y eventualmente se recolectará basura.

Los pros y los contras de " para cada " y " para i = " han sido debatidos aquí Para cada uno es bueno porque funciona con estructuras diferentes a las matrices y hace que un objeto esté disponible. " Para i = " tiene la ventaja de designar los límites y el orden de los elementos de la matriz en el bucle, y evita un error que puede encontrar con las matrices:

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

En este ejemplo, la matriz nunca se inicializa a 22. La variable i es solo una copia de un elemento de matriz, y el elemento de matriz original no cambia cuando se le asigna 22.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top