programing

Is String.Contains()가 String보다 빠릅니다.Index Of()?

mbctv 2023. 4. 21. 21:19
반응형

Is String.Contains()가 String보다 빠릅니다.Index Of()?

약 2000자의 문자열 버퍼가 있는데 버퍼에 특정 문자열이 포함되어 있는지 확인해야 합니다.
ASP를 사용하다「NET 2.0」입니다.

String이 있는지 아는 사람?메서드 String보다 성능우수합니다.Index Of 메서드?

    // 2000 characters in s1, search token in s2
    string s1 = "Many characters. The quick brown fox jumps over the lazy dog"; 
    string s2 = "fox";
    bool b;
    b = s1.Contains(s2);
    int i;
    i = s1.IndexOf(s2);

재미있는 사실

Contains ®IndexOf:

public bool Contains(string value)
{
    return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}

이 「」를 호출하는가.CompareInfo.IndexOfCLR을 사용하다

CLR에서 문자열이 어떻게 비교되는지를 확인하려면 여기에 표시됩니다(CaseInsensitiveComp를 찾습니다).도우미).

IndexOf(string).또한 선택지가 없습니다.Contains()는 순서형 비교(예를 들어 e와 같은 스마트 비교를 실행하는 것이 아니라 바이트 단위 비교)를 사용합니다.

★★★★★★★★★★★★★★★★★.IndexOf IndexOf"kernel32.dll" FindNLSString" 입니다.

에 대해 갱신되었습니다.NET 4.0 - IndexOf는 순서형 비교를 사용하지 않으므로 포함 속도가 빨라집니다. 아래의 코멘트를 참조해 주세요.

Contains(s2)는 StringComparison을 사용하기 때문에 IndexOf(s2)보다 몇 배(내 컴퓨터에서는 10배) 빠릅니다.IndexOf가 기본적으로 수행하는 문화에 민감한 검색보다 빠른 서수입니다(단, .net 4.0 http://davesbox.com/archive/2008/11/12/breaking-changes-to-the-string-class.aspx)에서는 변경될 수 있습니다).

포함은 IndexOf(s2, StringComparison)와 완전히 동일한 성능을 가집니다.Ordinal) > = 0 이지만 더 짧고 당신의 의도를 명확히 합니다.

실제 사례를 실행하고 있다(합성 벤치마크와 반대)

 if("=,<=,=>,<>,<,>,!=,==,".IndexOf(tmps)>=0) {

 if("=,<=,=>,<>,<,>,!=,==,".Contains(tmps)) {

이것은 제 시스템의 중요한 부분이며 131,953번 실행됩니다(DotTrace 덕분에).

아무리 놀라운 일이지만 결과는 예상과 정반대이다.

  • Index Of 533ms.
  • 266밀리초 포함.

:-/

net framework 4.0 (2012년 12월 13일 갱신)

Reflector를 사용하면 Contains가 IndexOf를 사용하여 구현됨을 알 수 있습니다.구현은 다음과 같습니다.

public bool Contains(string value)
{
   return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}

따라서 Contains는 IndexOf를 직접 호출하는 것보다 약간 느릴 수 있지만 실제 퍼포먼스에 큰 의미가 있을지는 의문입니다.

코드를 마이크로 최적화하려면 항상 벤치마킹하는 것이 최선의 방법입니다.

.net 프레임워크는 뛰어난 스톱워치 구현 시스템입니다.진단.스톱워치

조금 읽어보니, 후드 밑에 끈이 있는 것 같아요.메서드는 단순히 String을 호출합니다.Index Of.차이점은 String입니다.포함 문자열 동안 부울을 반환합니다.IndexOf는 하위 문자열을 찾을 수 없음을 나타내는 (-1) 정수를 반환합니다.

10만 번 정도 반복하여 간단한 테스트를 작성해 보시기 바랍니다.추측하자면 Index Of가 조금 더 빠르다고 할 수 있지만, 제가 추측한 대로입니다.

제프 앳우드는 블로그에 현악기에 관한 좋은 기사를 실었다.그것은 연결성에 더 가깝지만 그래도 도움이 될 수 있다.

오늘 1.3GB의 텍스트 파일로 시험해 보았다.그 중에서도, 모든 행이 「@」문자의 존재를 확인합니다.Contains/Index Of 에 17.000.000. 콜이 발신됩니다.결과: 모든 Contains('@') 콜의 경우 12.5초, Index Of('@') 콜의 경우 2.5초입니다.=> IndexOf의 처리속도는 5배!!(.Net 4.8)

이에 대한 업데이트와 마찬가지로 저는 몇 가지 테스트를 실시했습니다만, 입력 문자열이 상당히 큰 경우 병렬 Regex는 제가 지금까지 발견한 방법 중 가장 빠른 C# 메서드입니다(여러 개의 코어가 있는 경우).

일치 총량 가져오기:

needles.AsParallel ( ).Sum ( l => Regex.IsMatch ( haystack , Regex.Escape ( l ) ) ? 1 : 0 );

이게 도움이 됐으면 좋겠네요!

Jon Sket의 최근 시도와 같은 벤치마크 라이브러리를 사용하여 측정합니다.

경고 비우기

퍼포먼스에 관한 모든 질문(마이크로)과 마찬가지로, 이것은 사용하고 있는 소프트웨어의 버전, 검사 데이터의 상세, 및 콜을 둘러싼 코드에 의해서 다릅니다.

모든 (마이크로) 퍼포먼스에 관한 질문에서 첫 번째 단계는 유지보수가 용이한 실행 버전을 입수하는 것입니다.그러면 벤치마크, 프로파일링 및 조정을 추측이 아닌 측정된 병목 현상에 적용할 수 있습니다.

아직 이 글을 읽고 있는 사람이라면 대부분의 엔터프라이즈시스템에서 indexOf()가 더 잘 동작할 것입니다.contains()는 IE와 호환되지 않기 때문입니다.

언급URL : https://stackoverflow.com/questions/498686/is-string-contains-faster-than-string-indexof

반응형