문제

프로그램에서 HASH MAP 데이터 구조를 광범위하게 사용하고 있습니다. Barry Kelly가 코드 기어 포럼에 게시 한 해시 맵 구현을 사용하고 있습니다. 이 구현은 내부적으로 RTL의 비교 텍스트 기능을 사용합니다. 프로파일 링으로 인해 많은 시간이 Sysutils Comparetext 함수에서 소비된다는 것을 깨달았습니다.

나는 그것을 보았다

빠른 코드 사이트

그리고 비교 텍스트의 더 빠른 구현을 발견했습니다. 불행히도 그들은 D2009와 유니 코드 문자열에서 작동하지 않는 것 같습니다.

이제 질문을 위해 : D2009 문자열을 지원하는 유사한 더 빠른 버전이 있습니까? 비교 텍스트 함수는 해시 맵을 사용할 때 (적어도 현재 사용중인 구현에서) 많은 성능 개선이 실제로 차이를 만들 수 있습니다. 아니면 제시된 구현이 유니 코드 문자열에도 효과가 있어야합니까?

도움이 되었습니까?

해결책

많은 패스트 코드 함수는 아마도 Delphi 2009에서 컴파일되어 잘 작동하는 것처럼 보이지만 모든 입력에 적합하지는 않습니다. 어셈블러에서 구현 된 것은 문자가 각각 단지 1 바이트라고 가정하기 때문에 실패합니다. 델파이에서 구현 된 것은 조금 더 잘 지낼 것이지만, 오래된 결과 때문에 여전히 잘못된 결과를 반환 할 것입니다. CompareText"Case-Insensitive"라는 개념은 ASCII를 기반으로하는 반면 새로운 것은 유니 코드를 기반으로해야합니다. 캐릭터가 동일한 저장으로 간주되는 규칙은 많이 ASCII의 방식과 유니 코드와 다릅니다.

Andreas는 그 유니 코드 아래의 의견에서 말합니다 CompareText 여전히 ASCII Case-Comparison 규칙을 사용하므로 많은 패스트 코드 함수가 제대로 작동해야합니다. 캐릭터 크기의 가정을 만들지 않도록 그들을 사용하기 전에 그들을 살펴보십시오. 나는 그것을 기억하는 것 같습니다 약간 Fastcode 기능은 이미 Delphi RTL에 통합되었습니다. 나는 여부를 모른다 CompareText 그들 중 하나였습니다.

당신이 전화하는 경우 CompareText 해시 테이블에 많이 해시 테이블이 아주 잘하지 않음을 시사합니다. CompareText 해시 테이블에서 지정되지 않은 버킷을 찾고있는 해시 해시 만 호출해야합니다. 거기에서 해시 테이블은 종종 양동이에서 올바른 항목을 찾기 위해 선형 검색을 사용하며 호출합니다. CompareText 그 검색 중 모든 항목에 대해. 그것이 당신이 사용하는 것이 어떻게 작동하는지 여부를 모르겠습니다.

사용 가능한 버킷보다 결과를보다 고르게 배포하는 다른 해시 함수를 사용하여이를 해결할 수 있습니다. 버킷이 이미 균등하게 채워지면 더 많은 버킷이 필요할 수 있습니다 (해시 기능이 여전히 고르게 배포해야합니다. 저것 숫자도).

사용중인 해시 맵 클래스가 TBucketList, 그런 다음 버킷 스토리지 개선의 여지가 있습니다. 해당 클래스는 전체 입력에서 해시를 계산하지 않습니다. 입력을 사용합니다 사용할 버킷을 결정합니다. 클래스가 문자열에 대해 계산 된 전체 해시를 추적한다면 선형 검색 중 비교가 훨씬 더 빨리 진행될 수 있습니다. 해시를 비교하고 해시가 완전히 일치 할 때만 문자열을 비교하십시오. (256 개의 버킷리스트의 경우 가장 큰 지원되는 크기의 경우 입력의 1 바이트 만 버킷을 결정하고 나머지 바이트는 무시됩니다.) 나는 썼다 TBucketList 여기 전에.

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