VB 2008의 정렬 목록을 통해 반복하는 가장 효율적인 방법은 무엇입니까?

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

  •  08-07-2019
  •  | 
  •  

문제

아래 코드는 "각각의"루프가 "i to n"루프보다 약 10% 빠르지 만 각각의 새로운 메모리에서 567k를 생성한다는 것을 보여줍니다. 이게 옳은 거니? 속도 및 메모리 사용과 관련하여 일반적으로 가장 효율적인 방법은 무엇입니까?

이 코드를 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 % 더 빠릅니다. 그러나 "각각의 경우"루프는 후속 테스트에서 머리카락이 더 빠릅니다. "각각의 경우"루프는 조금 더 메모리를 사용했지만 이것은 일시적이며 결국 쓰레기가 수집됩니다.

"각각"과 "i ="의 장단점은 여기서 논의되었습니다. 각각은 배열 이외의 구조와 함께 작동하고 객체를 사용할 수있게하기 때문에 좋습니다. "i ="의 경우 루프에서 배열 항목의 경계와 순서를 지정할 수있는 이점이 있으며 배열과 관련하여 발생할 수있는 버그를 피하십시오.

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

이 예에서는 배열이 22로 초기화되지 않습니다. 변수 I은 배열 요소의 사본 일 뿐이며 원래 배열 요소는 22를 할당 할 때 변경되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top