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
'programing' 카테고리의 다른 글
| 반복하는 동안 NSMutable Array에서 제거하는 가장 좋은 방법은 무엇입니까? (0) | 2023.04.21 |
|---|---|
| Windows 명령줄 환경을 사용하여 파일 내의 텍스트를 검색 및 대체하려면 어떻게 해야 합니까? (0) | 2023.04.21 |
| Azure 데이터베이스의 비밀번호 재설정 (0) | 2023.04.21 |
| 정밀도를 잃지 않고 Python Float를 문자열로 변환 (0) | 2023.04.21 |
| Azure 스토리지 블럽 이름 변경 (0) | 2023.04.21 |