Pergunta

O código abaixo mostra mim (eu acho) que o "para cada" ciclo é cerca de 10% mais rápido que o "i para n" loop, mas o "para cada" laço cria 567k na nova memória? Isto está certo? Qual o caminho é geralmente mais eficiente com relação ao uso de velocidade e memória?

Se você deseja executar esse código em VB basta adicionar um botão e 2 etiquetas a um formulário.

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
Foi útil?

Solução

No meu sistema do "para i = 1" ciclo foi mais rápido para o primeiro teste (o primeiro clique do botão de execução do programa) por cerca de 20 por cento. Mas o "para cada" ciclo era um cabelo mais rápido em testes subseqüentes. A "para cada" ciclo levou um pouco mais de memória, mas isso é temporário e será, eventualmente, lixo coletado.

Os prós e contras de "para cada" e "para i =" foram debatidas aqui. Para cada um é bom porque ele trabalha com outras matrizes de estruturas, e faz com que um objeto disponível. "Para i =" tem a vantagem de designar os limites e ordem de itens de matriz na malha, e evita um erro que você pode encontrar com matrizes:

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

Neste exemplo, a matriz nunca é inicializado para 22. A variável i é apenas uma cópia de um elemento de matriz, eo elemento matriz original não é alterado quando i é atribuído 22.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top