문제

나는 다른 사람의 코드에서 두 번째 코드를 본 적이 있는데, 이 길이 비교는 코드 생산성을 높이기 위해 수행된 것 같습니다.특정 사전이 있는 스크립트 언어의 파서에서 사용되었습니다.단어의 길이는 4~24자이며 평균 7~8개의 글자로 구성됩니다. 알파벳에는 26개의 라틴 문자와 "@", "$" 및 "_"가 포함됩니다.

길이 비교는 STL 문자열로 작업하는 == 연산자를 이스케이프하는 데 사용되었습니다. 이는 분명히 단순한 정수 비교보다 더 많은 시간이 걸립니다.그러나 동시에 주어진 사전의 첫 글자 분포는 단순히 단어 크기 분포보다 넓으므로 비교 문자열의 두 첫 글자는 일반적으로 해당 문자열의 크기보다 더 자주 다릅니다.그러면 길이 비교가 불필요해집니다.

몇 가지 테스트를 실행해 본 결과 다음과 같습니다.두 개의 무작위 문자열 비교를 백만 번 테스트하는 동안 두 번째 방법이 훨씬 빠르므로 길이 비교가 도움이 될 것 같습니다.그러나 작업 중인 프로젝트에서는 디버그 모드에서는 훨씬 더 느리게 작동하고 릴리스 모드에서는 충분히 빠르게 작동하지 않습니다.

그래서 내 질문은 다음과 같습니다.길이 비교가 비교를 가속화할 수 있는 이유와 속도를 늦출 수 있는 이유는 무엇입니까?

UPD:나는 두 번째 방법도 마음에 들지 않지만 이유가 있어서 그렇게 된 것 같습니다. 그 이유가 무엇인지 궁금합니다.

UPD2:진지하게, 문제는 최선을 다하는 방법이 아닙니다.이 경우에는 더 이상 STL 문자열을 사용하지 않습니다.길이 비교가 불필요하고 잘못된 것은 당연합니다.놀라운 점은 특정 테스트에서 실제로 약간 더 잘 작동하는 경향이 있다는 것입니다.이것이 어떻게 가능한지?

도움이 되었습니까?

해결책

무작위 테스트에서 문자열은 이득을 표시할 만큼 충분히 길었을 수 있지만 실제 사례에서는 더 짧은 문자열을 처리할 수 있으며 두 비교의 상수 요소는 테스트의 문자열 비교 부분을 수행하지 않음으로 인한 이득으로 상쇄되지 않습니다.

다른 팁

문제가 있다면 도서관이 이미 해냈다고 가정하십시오. 실제로 중요하지 않으면 소액 최적화를 위해 코드를 엉망으로 만들지 마십시오.

단락이 언제 도움이 될 수 있는지

단락 최적화는 다음과 같은 경우에만 도움이 될 수 있습니다.

  • 전체 테스트 비용에 비해 비교 비용이 낮습니다.
  • 비교하면 종종 단락이 발생합니다

수학적으로, 단락 조건의 비용, 전체 조건의 비용, 단락 회로가 발생하는 경우 (전체 조건이 필요하지 않음).

원래 사례의 평균 비용 (단락 없음)은 F입니다.

단락 최적화의 평균 비용은 S + F * (1-P)입니다.

따라서 최적화가 전혀 혜택을 누리려면 다음을 적용해야합니다.

s + f * (1-p) <f

s <f*p

문자열 비교 비용

또한 당신은 다음과 같이 썼습니다.

간단한 정수 비교보다 더 많은 시간이 걸립니다.

이것은 전혀 분명하지 않습니다. 문자열 비교는 첫 번째 차이가 발견 될 때 종료되므로 처리하는 문자열에 따라 대부분의 경우 첫 번째 또는 두 번째 문자에서 종료 될 수 있습니다. 또한, 두 문자열에 충분한 데이터가있는 한 먼저 DWORDS (한 번에 4 자)을 비교하여 더 긴 문자열에 대해서도 비교가 최적화 될 수 있습니다.

너의 경우

랜덤 테스트 데이터와 스크립팅 구문 분석의 주요 차이점은 실제 데이터가 무작위와는 거리가 멀다는 것입니다. 파서는 아마도 결정적 일 가능성이 높으며 일단 일단 일단 일치하면 더 이상 비교하지 않습니다. 스크립트 데이터조차도 무작위가 아닙니다. 일부 키워드는 다른 키워드보다 훨씬 더 많이 사용될 수 있습니다. 파서가 가장 일반적으로 사용되는 키워드를 먼저 확인하는 방식으로 구조가 구성되면, 현악기가 일치 할 때 항상 완전 비교가 필요하기 때문에 놀랍게도 많은 비교가 완료해야 할 수도 있습니다.

일반적으로 이것을 STL에 맡기고 걱정하지 않아야합니다.

그러나 이것이 당신이 최적화 해야하는 영역이라면 (심각하게 의심 스럽다), 문자열의 문자 분포/길이 분포를 이해하면 문자열에서 새 클래스를 도출하고 == 운영자를 과부하시킬 수 있습니다. 응용 프로그램에 가장 효율적인 방법으로 평등 테스트. (길이는 먼저, 첫 번째 문자 먼저, 앞으로 앞으로, 뒤로, 무엇이든).

코드 전체에 '최적화'가 흩어져있는 것보다 낫습니다.

STD :: 문자열 연산자 ==의 구현은 길이를 먼저 확인하는 것이 더 빠르거나 문자 확인을 시작하는 것이 더 빠르는지 알 수있는 방법이 없습니다. 길이를 명확하게 점검하는 것은 같은 길이의 문자열에 대한 폐기물입니다. 따라서 STL의 다른 구현이 다르게 수행 될 가능성이 높습니다.

명시 적 길이 체크인을 최종 최적화 (명확하게 댓글을 달았 음)로만 프로파일 러가 이점을 확인하는 경우에만 적용하십시오.

길이 비교는 나에게 의미가 없습니다 .. 비교 연산자를 사용하면 충분합니다.

STL의 구현을 발사하십시오. 중요하지 않아야합니다

길이 비교는 일부 단락 최적화를 시도합니다.

길이 비교가 전체 문자열 비교보다 빠르다고 가정하므로 불일치의 99%를 제거 할 수 있다면 매번 전체 문자열 비교를 수행하는 것보다 빠릅니다.

코드는 길이 비교를 실행하고 실패하면 전체 문자열 비교를 무시하고 코드를 건너 뜁니다.

std :: 문자열의 길이는 std :: 문자열 객체의 구성원 일 것입니다. 이에 비해 첫 번째 캐릭터는 힙에있을 수 있습니다. 즉, 문자열 길이를 비교하면 참조의 위치가 향상됩니다. 물론 짧은 스트링 최적화로 인해 더욱 복잡해집니다. Lhs[0] 힙에있을 수 있습니다 Rhs[0] 스택에 있습니다.

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