2015-01-17 3 views
2

현재 내 게임 엔진에 대한 로그 작성 시스템입니다.지도 키로 문자열 대 해시 - 성능

모든 것을 명료하게 유지하려면 Logger 객체 각각에 이름을 지정해야합니다. Logger 객체는 모든 Logger 인스턴스를 추적하는 LogManager 클래스에 저장됩니다. 지도가 이름을 나타내는 std :: string을 사용하여 Logger 인스턴스에 대한 포인터를 저장하고 있습니다.

나는 latecny를 줄이는 것이 매우 중요하므로 실시간 3D 엔진을 개발 중입니다. 그래서 두 번째 방법으로 저장할 수 있습니다 - 빠른 해시 알고리즘 (예 : MurMur 해시 3)을 사용하고 문자열 대신 64 비트 해시 만 저장합니다.

그리고 지금, 내 질문 :지도 키 값을 런타임에 성능이 더 좋기 때문에 문자열 대신 해시를 사용하고 있습니까 (내 및 글로벌 경우)? @Edit 액세스 코드

std::map<std::string, CLogger*> map1; 
std::map<QWORD, CLogger*> map2; 

// access : 
CLogger * logger = map1["root"]; 
CLogger * logger = map2[getHashedString("root")]; 

// 

QWORD getHashedString(const std::string string) 
{ 
    QWORD val = 0; 
    hash_x64_128(string.c_str(), string.length(), 1234, &val); 
    return val; 
} 

알고리즘 위에서 사용

는 불평 해시 3 (https://code.google.com/p/smhasher/source/browse/branches/chandlerc_dev/MurmurHash3.cpp)

베스트 감사합니다.

+0

이러한 로거에 액세스하는 것이 문제 였는지 프로필을 작성 했습니까? 아니면 해시와 문자열을 비교 했습니까? – Borgleader

+0

@ Borgleader 1 000 000 000 반복 이상, 건식 테스트를했는데 액세스 시간의 차이는 약 70 초이지만 여전히 해시를 사용하는 것이 좋은 습관인지는 모르겠다. 그리고 네, 해시 대 문자열만을 프로파일했습니다. –

답변

1

확실히. 그러나 생성 된 해시 코드가 고유한지 확인하십시오. 성능 향상은 사용중인 맵 구현에 따라 다릅니다. 예를 들어 stl::map은 검색 트리를 사용하여 키를 저장합니다. 이 경우 많은 문자열 비교를 저장할 수 있습니다. stl::unordered_map을 사용하는 경우 이미 해시 값을 사용하므로 적은 수익을 얻습니다. 하지만 당신이 독창적으로 해쉬 연산을하면 해시 계산에 대한 런타임을 절약 할 수 있습니다.

매우 중요한 것 : 최적화 전후 런타임 측정;)

0

지도에 액세스하는 코드를 제공해 주실 수 있습니까?

자신의 해시 계산과 해시를 계산하는 접근 자의 차이점은 아마도 자신의 해시를 사용하여 맵의 해시 매개 변수가 ID 함수가된다는 것입니다.

+0

안녕하십니까, 답변 해 주셔서 감사합니다. 내 게시물 아래에 전체 액세스 코드를 추가했습니다. –

+0

주어진 코드에서 이미 간단한 숫자 키를 사용하여 사소한 해시 함수를 사용하고 있으며 새 스키마에 충돌이 없을 수도 있습니다. 지도를 정렬 할 필요가 없으면 순서가 매겨지지 않은지도를 선택하는 것이 좋습니다. –