VB 2008의 정렬 목록을 통해 반복하는 가장 효율적인 방법은 무엇입니까?
-
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를 할당 할 때 변경되지 않습니다.
제휴하지 않습니다 StackOverflow