2014-12-09 2 views
2

내 클래스 라이브러리 문자열의 많은은 첫 번째 문자가 특정 문자와 일치하는지 여부를 확인합니다. 색인을 통해 첫 번째 문자에 액세스하여이 작업을 수행합니다.문자열의 첫 번째 문자를 가져 오는 빠른 방법은 무엇입니까?

var isMatch = stringToCheck[0] == SPECIAL_CHARACTER; 

빠른 검사 방법이 있습니까?

배경 : 내 클래스 라이브러리는 문자열을 기반으로 인터페이스를 제공합니다. 위의 검사가 필요한 내부 데이터 구조로 변환됩니다. 불행하게도 많은 데이터가 인터페이스를 통과합니다. 필자는 전체 테스트 시간 중 40 % 이상이 단일 테스트 라인을 사용하여 테스트 스위트를 프로파일 링했습니다.

+0

문자열 시작 부분에서 2 바이트를 검색하고 16 비트 값을 다른 16 비트 값과 비교하는 것보다 속도가 더 빠를 수 있습니까? 코드가하는 또 다른 작업은 무엇입니까? 코드의 나머지 60 %가 이보다 싼 가격이라면, 당신이 꽤 좋은 모양 인 것처럼 보이겠습니까? –

+3

그만큼 빠르다 (또는'.First'를 사용하십시오). 그 라인에서 당신 시간의 40 % *를 보냈습니까? 그럴 것 같아. – BradleyDotNET

+1

다음으로 가장 빠른 방법은 '안전하지 않은'코드 일 것이지만 'System.String'의 메모리 레이아웃이 .NET 버전간에 동일하게 유지되지 않도록주의하십시오. – Dai

답변

3

아니요. 말할 수있는 한 멀리 있지 않습니다.

가장 빠른 방법은 m_firstCharstring 클래스를 보유 할 수 있지만 불행히도 private이라고 선언됩니다.

접근자는 this 접근이 가장 빠릅니다. CLR에 points directly to the unmanaged implementation이 있으므로 더 빨리 가져 오기가 어렵습니다.

0

안전하지 않은 작업을 기꺼이 사용하려는 경우 문자열에 대한 포인터를 가져 와서 첫 번째 문자를 얻을 수 있습니다. (당신은 빌드 설정에서 안전하지 않은 코드를 사용하고 작동이 방법 또는 클래스 unsafe을 표시해야합니다.)

char cChr; 

fixed (char* pStr = sString) 
{ 
    cChr = *pStr; 
} 

var isMatch = (cChr == SPECIAL_CHARACTER); 

내부적으로이 System.Runtime.CompilerServices.RuntimeHelpers.get_OffsetToStringData 전화로 컴파일됩니다 -이 약간 빠른 인덱서 액세스에 비해이 될 수 있지만, 다른 잠재적 인 문제 (안전하지 않은 코드 사용과 관련이 있음 - 어떤 이유로 든 안전하지 않은 코드 사용에 대한 정책이 있음)를 엽니 다.

그래도 성능이 크게 향상되는 것은 아니지만이 코드는 매우 간단하므로 라이브러리의 다른 모든 항목이이 코드를 숨겨야합니다. 귀하의 질문에 귀하의 한 줄짜리가 귀하의 실행 시간의 40 %를 사용한다고 믿는 데 어려움이 있습니다.

관련 문제