문제

List1은 다음 예제에 SortedList (MyClass)이며 251 명의 회원이 포함되어 있습니다.

처음 두 개의 코드 블록은 15.5 초 안에 실행됩니다.

 For cnt As Integer = 1 To 1000000
        For Each TempDE In List1
            Dim F As String = TempDE.Key
            TempDE.Value.x1 = 444
        Next
    Next

 

    For cnt As Integer = 1 To 1000000
        For Each TempDE As KeyValuePair(Of String, phatob) In List2
            Dim F As String = TempDE.Key
            TempDE.Value.x1 = 444
        Next
    Next

이것은 5.6 초 안에 실행됩니다.

    For cnt As Integer = 0 To 999999
        For cnt2 As Integer = 0 To 250
            Dim F As String = List1.Keys(cnt2)
            List1.Values(cnt2).x1 = 444
        Next

    Next

처음 두 코드 블록이 왜 그렇게 느리게됩니까?

도움이 되었습니까?

해결책

SortedList는 ICOMPARER를 구현하여 정렬 기능을 제공하여 컬렉션을 확장합니다. 내부적으로, 2 개의 배열을 구현하여 목록의 요소를 저장합니다 - 키에는 1 개의 배열이 있고 값은 하나입니다. .NET 배열은 빠른 순차적이고 빠른 임의의 액세스를 위해 최적화됩니다.

첫 번째 2가 느린 이유는 SortedList의 Foreach 문이 열거자를 주변의 래퍼이기 때문입니다. Foreach는 열거자를위한 쿼리, movenext 및 current를 호출합니다. 또한, 일반 목록은 목록을 가로 질러 복싱 및 Unboxing을 포함 할 수 있으며, 일반적으로 인덱스별로 액세스하지 못하는 성능 오버 헤드를 만들 수 있습니다.

다른 팁

정확히 어떻게 설명을 찾으려고 노력했습니다. For Each 행동하지만 찾을 수 없었습니다.

나의 이론은 그것을 사용하는 것입니다 For Each 명령문은 목록의 객체를 메모리의 다른 지점에 복사 한 다음 루프의 각 반복이 종료 될 때 목록에 다시 복사합니다.

또 다른 가능성은 모든 반복의 시작시 생성자를 호출 한 다음 생성자를 다시 해체하고 호출하여 다음 반복을 재설정 할 수 있습니다.

이 이론 중 하나에 대해서는 확실하지 않지만 3과 (1 또는 2)의 주요 차이점은 부족입니다. For Each.

편집 : 문서를 찾았습니다 MSDN.

여기에 발췌가 있습니다.

다음 루프가 시작되면 다음 루프가 시작되면 Visual Basic은 해당 그룹이 유효한 수집 객체를 참조하는 것을 확인합니다. 그렇지 않다면 예외가 발생합니다. 그렇지 않으면 첫 번째 요소를 반환하기 위해 Movenext 메소드와 열거 자체의 현재 특성을 호출합니다. MOVENEXT가 다음 요소가 없음을 나타내는 경우, 즉 컬렉션이 비어있는 경우 각 루프마다 종료되고 다음 명령문에 따라 제어가 명령문으로 전달됩니다. 그렇지 않으면 Visual Basic은 요소를 첫 번째 요소로 설정하고 명령문 블록을 실행합니다.

그래서 전반적으로 들립니다 For Each 더 "관리"되고 모든 것이 일치하는지 확인하기 위해 많은 오버 헤드를 수행합니다. 결과적으로 느린다.

고정 루프 범위로 인해 컴파일러가 블록 3을 더 잘 최적화 할 수 있다고 생각합니다. 블록 1과 2에서 컴파일러는 루프의 상한이 목록을 평가할 때까지 어떤 것이 무엇인지 알지 못하여 느리게 만듭니다.

내 무작위 추측 : List1에는 ~ 750 개의 요소가 포함되어 있습니다 (250이 아님). List1이 가지고있는 각 요소를 반복하지 않기 때문에 세 번째 사례는 더 빠릅니다.

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