2010-11-23 6 views
3

안녕하세요,는 IEnumerable <T>와 "항복 복귀"성능 문제

나는 기본적으로 this one의 수정 된 버전입니다 간단한 렉서를 쓰고 있어요. 각 토큰을 얻은 후에 약간의 수정을 수행하고 유형을 다시 확인하기 위해이를 다시 분석해야합니다. 물론 어휘 분석을 한 후에는 전체 토큰 목록을 다시 사용하여 일종의 "구문 분석"을 만들어야합니다. 제 질문은 렉서에 IEnumerable<Token>yield return 문을 사용하면 전체 프로그램의 성능이 느려질 수 있습니다 ... List<Token>을 사용하여 목록을 반복 작성하고 일반 return 문을 사용하는 것이 바람직합니까? IEnumerable/List을 반복하는 것은 어떻습니까? 어느 것이 더 빠릅니까?

대단히 감사합니다.

+2

코드 벤치마킹 시도 ... 인식 된 성능 향상을 위해 가독성을 희생하지 마십시오. –

답변

5

잘못된 질문을하는 경우 Regex 비용에 대해 더 많이 걱정해야합니다. 토큰을 열거하는 것은 그 중 아주 작은 부분 일 것이며, 속도를 두 배로 향상시킬 수있는 코드 최적화의 요점은 없지만 프로그램 성능을 1 % 향상시킬뿐입니다.

코드를 작성하여 버전 2에 대해 알아야 할 사항을 알 수 있습니다. 이러한 종류의 도구는 '인간의 시간'에서 실행됩니다 (프로그램이 20 밀리 초를 필요로 할 때 두 배의 시간이 걸리면 인식할만한 차이가 없음)), 가장 가능성있는 결과는 "아무것도 할 필요가 없습니다"입니다. 지금까지

+0

감사합니다. 한스. 하지만 Regex의 성능을 향상 시키려면 어떻게해야할까요? – Miguel

+0

메시지를받지 못했습니다. 다른 방향으로 가야합니다 : "Regex에 perf 문제가 있다는 것을 알았습니다. 이것이 내가 요구 한 것입니다. 이것이 내가 측정 한 것입니다." 실제 문제를 문서화 할 때만 실제 답변을 기대할 수 있습니다. 아직 진짜 문제는 없습니다. –

3

일부는 성능에 영향을 미칠 수 있지만 iterator가 지연 생성 될 수도 있습니다.

개인적으로 가장 읽기 쉬운 방법으로 코드를 작성하고 성능을 측정 할 수 있습니다. 다음 미세 정렬에 신경을 쓰십시오. 한 가지 방식으로 테스트하고, 다른 방식으로 테스트하고, 가장 성능이 우수한 솔루션을 사용하여 얼마나 가독성을 잃어 버렸는지 확인하고 실제로 얼마나 많은 속도를 얻을 수 있는지보십시오.

List<T>가 변경 가능한 구조체를 사용하여 반복자 자체를 구현으로, List<T>에 의해 구현 될 일어나는 IEnumerable<T>을 통해 반복하는 대 형 List<T>의 것으로 알려져있다 표현식을 반복하는 아주 약간의 성능 향상이 있다고

주 .. 기본적으로 더 높은 추상화 레이어를 사용하면 boxed value로 끝날 것입니다.하지만 특정 경우에는 거의 이 될 것입니다. 확실히은 작은 성능 향상 이상으로 올바른 추상화를 선호합니다.

1

IEnumerable 및 yield return 문은 GetEnumator()와 IL 코드의 열거 자 구현으로 변환됩니다.

열거 중에 반환되는 각 토큰에 대해 몇 가지 추가 작업을 수행한다는 측면에서 수익률 반환은 장점이 있지만 목록 작성과 그로 인한 메소드 호출이 적어 목록 반환은 더 빨라야합니다.

+0

어떻게하면 적은 수의 메서드 호출이있을 것이라고 생각합니까? 아마도 각 항목에 대해 Add에 대한 호출이있을 것이고 iterator 블록 버전에서는 필요하지 않을 것입니다. 두 경우 모두 동일한 수의 MoveNext()/Current 호출이 있습니다. –

0

, 난 당신이 정말이 속도를하려는 경우, 정규 표현식이 보인다, 그러나 많은에 따라, the root of all evil.

당신이 인 조기에 최적화하기 위해 노력하고 있음을 볼 수 있습니다 확신 그것을하는 비싼 방법. 매번 Regex.Match()를 수행하면 문자열을 다시 스캔하므로 최소한 스캔 한만큼의 결과가됩니다.

토큰을 정의하는 경계 (예 : '{'와 '}')를 알고 있다면 토큰 열거 형을 작성하기 위해 문자열을 한 번 스캔 할 수 있습니다 (yield 또는 list로 생각하지 않습니다. 그것은 많은 차이를 만들 것입니다.) 호출자는 문자열을 다시 작성하여 토큰을 대체 할 값을 찾습니다.

물론 이것은 단순한 "검색 및 바꾸기"형식 토큰에서만 작동합니다. 좀 더 복잡한 것들은 정규식과 같은 좀 더 정교한 것을 필요로합니다. 토큰 정의를 확장하여 일치 항목이 단순한 것인지 또는 정규식인지 여부를 지정할 수 있습니다. 이렇게하면 수행되는 정규 표현식의 수가 줄어들지 만 필요한 유연성을 유지할 수 있습니다.

관련 문제