문제

목록을 자주 단일 요소를 검색 해야하는 코드베이스로 작업하고 있습니다.

목록에서 열거를하는 것보다 술어를 사용하는 것이 더 빠릅니까?

예를 들어:

string needle = "example";
FooObj result = _list.Find(delegate(FooObj foo) {
    return foo.Name == needle;
});

vs.

string needle = "example";
foreach (FooObj foo in _list)
{
    if (foo.Name == needle)
        return foo;
}

기능은 동일하지만 성능에도 동일합니까?

도움이 되었습니까?

해결책

그것들은 성능에 동등하지 않습니다. find () 메소드에는 목록의 모든 항목에 대한 메소드 (이 경우 델리게이트) 호출이 필요합니다. 메소드 호출은 무료가 아니며 그렇습니다 비교적 인라인 비교와 비교하여 비싸다. Foreach 버전은 객체 당 추가 메소드 호출이 필요하지 않습니다.

즉, 실제로 코드를 프로파일 링하고 문제가 문제가 될 때까지 성능을 기반으로 하나 또는 다른 하나를 선택하지 않을 것입니다. 나는이 시나리오의 오버 헤드가 내가 쓴 코드의 "핫 경로"문제에 대해 아직 찾지 못했고이 패턴을 찾거나 다른 유사한 방법으로 많이 사용합니다.

다른 팁

목록을 검색하는 것이 너무 느리면 선형 검색보다 더 잘할 수 있습니다. 목록을 정렬 할 수 있으면 이진 검색을 사용하여 O (LG N) 시간의 요소를 찾을 수 있습니다.

검색하는 경우 a 전부의 로트, 해당 목록을 사전으로 바꾸는 것을 고려하여 이름으로 객체를 색인화하십시오.

기술적으로, 대의원 버전의 런타임 성능은 다른 버전보다 약간 더 나쁩니다. 그러나 대부분의 경우 차이를 인식하기가 어려울 것입니다.

더 중요한 (IHMO)는 원하는 방식보다는 원하는 것을 쓸 수있는 코드 시간 성능입니다. 이것은 유지 관리에 큰 차이를 만듭니다.

이 원래 코드 :

string needle = "example";
foreach (FooObj foo in _list)
{
    if (foo.Name == needle)        
        return foo;
}

관리자가 코드를 읽고 특정 항목을 찾고 있음을 이해해야합니다.

이 코드

string needle = "example";
return _list.Find(
    delegate(FooObj foo) 
    {
        return foo.Name == needle;
    });

당신은 당신이 특정 항목을 찾고 있음을 분명히합니다 - 더 빨리 이해할 수 있습니다.

마지막으로 C# 3.0의 기능을 사용하는이 코드 :

string needle = "example";
return _list.Find( foo => foo.Name == needle);

정확히 똑같은 일을하지만 읽고 이해하기가 더 빠른 한 줄로 람다 표현, 그래도).

요약하면, 대안의 성능이 거의 동일하다는 점을 감안할 때 코드를 쉽게 읽고 유지 관리 할 수있는 코드를 선택하십시오.

"저는 코드베이스와 함께 일하고 있습니다 기울기 필요합니다 자주 검색되었습니다 단일 요소의 경우 "

더 나은 성능을 얻기 위해 목록 대신 사전으로 데이터 구조를 변경하는 것이 좋습니다.

비슷한 질문이 목록에 요청되었습니다 .foreach vs. foreach-tertation (foreach vs somelist.foreach () {}).

이 경우 목록.

Jared가 지적했듯이 차이점이 있습니다.

그러나 항상 그렇듯이 병목 현상이라는 것을 알면 걱정하지 마십시오. 그리고 병목 현상 인 경우, 아마도 목록이 크기 때문에 아마도 더 빠른 찾기를 사용하는 것을 고려해야합니다 - 해시 테이블이나 이진 트리를 사용하거나 목록을 정렬하고 이진 검색을 수행하면 로그 (n)를 제공합니다. 선형 케이스를 조정하는 것보다 훨씬 더 많은 영향을 미치는 성능.

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