Какой самый эффективный метод для циклического прохождения SortedList в VB 2008?

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

  •  08-07-2019
  •  | 
  •  

Вопрос

Приведенный ниже код показывает мне (я думаю), что " для каждого " цикл примерно на 10% быстрее, чем "i to n"; цикл, но "для каждого" цикл создает 567к в новой памяти? Это правильно? Какой способ в целом наиболее эффективен в отношении скорости и использования памяти?

Если вы хотите запустить этот код в VB, просто добавьте кнопку и 2 метки в форму.

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
Это было полезно?

Решение

В моей системе " для i = 1 " Цикл был быстрее для первого теста (первое нажатие кнопки запуска программы) примерно на 20 процентов. Но "для каждого" петля была на волосок быстрее на последующих тестах. & Quot; для каждого " цикл занял немного больше памяти, но это временно и в конечном итоге будет собирать мусор.

Плюсы и минусы "для каждого" и "для i ="; были обсуждены здесь. Для каждого это хорошо, потому что он работает со структурами, отличными от массивов, и делает объект доступным. " Для i = " имеет преимущество определения границ и порядка элементов массива в цикле и позволяет избежать ошибки, с которой вы можете столкнуться при работе с массивами:

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

В этом примере массив никогда не инициализируется равным 22. Переменная i является просто копией элемента массива, и исходный элемент массива не изменяется, когда i назначается 22.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top