2013-02-19 4 views
2

나는 메모리 내 byte[]을 가지고 있으며 1310 인 오프셋을 찾을 필요가 있습니다.64 비트 컴퓨터에서 2 바이트를 검색하여 위치를 반환하는 가장 빠른 방법은 무엇입니까?

String oneLine = Encoding.ASCII.GetString(bytes, 0, max); 

64 비트 컴퓨터에서 두 바이트를 검색하는 가장 빠른 방법은 무엇입니까 : 나는 그 라인을 추출하려면 다음을 사용할 것인가? .. 문자열로 변환 하시겠습니까?

13을 스캔 한 다음 10을 스캔하면 각 바이트를 반복하는 것 외에 다른 작업이 있습니까?

+7

아마 있을지 모르지만 당신이 측정하고 간단한 접근 방식이 빠르지 않다고 * 알았습니까? –

+1

먼저 문자열로 변환하고'yourString.IndexOf (Environment.NewLine)'을 수행하는 것이 더 빠릅니까? 진정으로 궁금한 점은 ... – DiskJunky

+1

@PaulSasik 글쎄, 종종 캐시 및 CPU 친화적 인 방식으로 같은 일을함으로써 일정한 요소의 속도 향상을 얻을 수 있습니다. 때로는 그 일정한 요소가 중요합니다. 그러나 OP와 다른 모든 사람들은 가장 빠른 방법을 요구하는 것이 종종 시간 낭비와 잘못된 질문으로 시작한다는 것을 알고 있습니다. 그래서, OP : 왜 신경 안 씁니까? 호기심 (아무것도 그와 함께 틀리게)? 분명한 방법이 너무 느리다는 느낌! 프로파일 링과 벤치마킹을 통해 잘 짜여졌습니다. 지식이 있어야보다 느립니다. 중간의 것만 나쁜 이유입니다. – delnan

답변

1

'가장 빠른 방법'이 될지 확실하지 않지만 Boyer-Moore 알고리즘을 사용하여 필요한 값의 색인을 찾을 수 있습니다.

이 봐가 SO 스레드 가지고 Search longest pattern in byte array in C#

보이어 - 무어는 '바늘'당신의 길이에 따라 요소를 건너 뛸 수는 '건초 더미'로 더 얻을 수 있기 때문에 선형 배열 탐색보다 더 나은 것 더 커집니다. HTH.

+0

바늘은 2 바이트이지만, 건너 뛰기가 거의 없습니다. – harold

1

2 바이트 시퀀스를 찾고 있으므로 모든 바이트를 스캔 할 필요가 없습니다. 대상 인덱스에 13이 포함되어 있으면 다음 바이트에서 10을 찾습니다. 대상 인덱스가 10 인 경우 이전 바이트에서 13을 찾습니다. 그러면 선형 검색에서 대략 반으로 스캔 시간이 단축됩니다.

+0

예 Boyer-Moore 패턴의 변형 인 것 같습니다. (정확하게 이해한다면) – LamonteCristo