문제

getEnumerator ()를 사용하고 ienumerator.current를 주조하는 것은 비싸다고 생각합니다. 더 나은 제안이 있습니까?

더 나은 성능으로 비슷한 기능을 제공하는 경우 다른 데이터 구조를 사용할 수 있습니다.

생각 후 :
제네릭 스택이 캐스트가 필요하지 않도록 더 나은 아이디어가 될까요?

도움이 되었습니까?

해결책

벤치 마크를 했습니까, 아니면 단지 직감입니까?

처리 시간의 대부분이 스택을 통해 반복되는 데 소비된다고 생각되면 벤치마킹하고 그렇습니다. 그렇다면 몇 가지 옵션이 있습니다.

  1. 루핑이 필요하지 않도록 코드를 재 설계하십시오
  2. 더 빠른 루핑 구조를 찾으십시오. (그다지 중요하지는 않더라도 제네릭을 추천합니다. 다시 한번 벤치 마크를하십시오).

편집하다:

필요한 루핑의 예는 목록에서 조회를하거나 두 목록 또는 이와 유사한 일치하는 경우입니다. 루핑이 오랜 시간이 걸리면 목록을 이진 트리 또는 해시 맵에 넣는 것이 합리적인지 확인하십시오. 초기 생성 비용이있을 수 있지만 코드가 재 설계되면 나중에 O (1) 조회를 수행하여이를 다시 얻을 수 있습니다.

다른 팁

Stack<T> (Foreach와 함께) 실제로 캐스트를 저장하지만 실제로는 권투 전부가 아닙니다 저것 나쁜 사물의 그랜드 계획에서. 성능 문제가 있다면 이것이 많은 가치를 더할 수있는 영역이라고 의심합니다. 프로파일 러를 사용하고 실제 문제에 중점을 둡니다. 그렇지 않으면 조기입니다.

데이터를 한 번만 읽으려면 (예 : 스택을 기꺼이 소비하는 것이 기쁘다). 5월 더 빨리하십시오 (열거 자의 오버 헤드를 피하십시오). ymmv.

    Stack<T> stack = null;
    while (stack.Count > 0)
    {
        T value = stack.Pop();
        // process value
    }

예, 일반적인 스택을 사용하면 캐스트가 절약됩니다.

스택의 기능이 필요한 경우 (목록 또는 다른 Colleciton 유형에 적용되는대로) 일반 스택을 사용하십시오. 컴파일러가 런타임에 캐스팅을 건너 뛸 때 (컴파일 타임에 자극되어 있기 때문에) 컴파일러가 캐스팅을 건너 뛸 때 약간의 속도가 빨라집니다.

Stack<MyClass> stacky = new Stack<MyClass>();

foreach (MyClass item in stacky)
{
    // this is as fast as you're going to get.
}

일반에 걸쳐 열거합니다 IEnumerable<T> 또는 IEnumerator<T> 반복 변수가 유형 T 인 경우 캐스트를 생성하지 않으므로 대부분의 경우 제네릭을 사용하는 것이 더 빨라질 것이지만, 특히 값 유형과 함께 사용할 때는 매우 미묘한 문제가 있습니다.

Rico Mariani (Microsoft Performance Architect)는 차이점과 토대를 자세히 설명하는 게시물이 있습니다.

속도에 관한 한 여러 변수가 있으며 컨텍스트에 따라 다릅니다. 예를 들어, C#과 같은 자동 메모리 관리 코드베이스에서는 게임과 같은 프레임 속도에 영향을 줄 수있는 할당 스파이크를 얻을 수 있습니다. Foreach 대신 이것을 위해 만들 수있는 좋은 최적화는 While Loop을 가진 열거 자입니다.

var enumerator = stack.GetEnumerator();

while(enumerator.MoveNext ()) {
  // do stuff with enumerator value using enumerator.Current
  enumerator.Current = blah
}

CPU 벤치 마크까지는 이는 아마도 Foreach보다 빠르지 않지만, Foreach는 의도하지 않은 할당 스파이크를 가질 수 있으며, 이는 궁극적으로 응용 프로그램의 성능을 "느리게"할 수 있습니다.

열거자를 만들기위한 대안은 ToArray 메소드를 사용한 다음 배열을 반복하는 것입니다. 스택 반복기는 스택이 수정되었는지 여부를 확인하기 위해 약간의 오버 헤드를 유발하는 반면 배열의 반복은 빠릅니다. 그러나 물론 처음에는 배열을 만드는 오버 헤드가 있습니다. MATS가 말했듯이 대안을 벤치마킹해야합니다.

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