2016-10-27 1 views
1

많은 반복적 인 짧은 문자열을 저장하고 조작하는 시스템을 구현하고 있습니다. 예를 들어 주식 시리즈. (이에 MSFT 같은짧은 문자열을위한 부스트 플라이 웨이드

<time1>,MSFT,60.01 
<time2>,MSFT,60.02 
<time3>,MSFT,60.00 

내가 메모리 할당, 문자열 검색/비교/그 작은 반복적 인 시세 이름의 복사 비용을 최적화 할 수 Boost::Flyweight를 사용하여 생각하고 : 나는 마이크로 소프트 주가의 반복적 인 항목을 많이해야합니다 케이스).

하지만 그 문자열은 처음에는 꽤 작습니다. 대개 단지 몇 바이트입니다. 긴 유형은 현대 컴퓨터에서 이미 8 바이트입니다. 이 경우 Boost::Flyweight을 사용하는 것이 가치가 있습니까?

Boost::Flyweight에 대한 나의 이해는 성능 향상을 위해 내부화 된 문자열이 정수라는 것입니다. 하지만 8 바이트 문자열을 조회/비교/복사하는 것은 8 바이트 길이의 데이터 형식에서 작동하는 것과 크게 다를 것이라고 생각합니다. 따라서 Boost::Flyweight으로 이동하는 것은 가치가 있습니까?

내 주요 목표는 속도 최적화 측면에서 메모리 최적화 측면과 반대입니다. 하나를 선택해야합니다.

+0

몇 가지 생각이 떠오른다 : 1) 내가 부스트의 구현에 익숙하지 않은,하지만 난이 플라이급 같은 느낌

UPDATE 그냥 내가 나스닥 종목에 대한 완벽한 해싱을 사용하여 만든이 관련 데모를 기억 패턴은 주로 메모리 절약을위한 것이지 스피드가 아닙니다. 2) 캐시 위치를 잊지 마라. 플라이급은 "로컬"로 작업하는 다른 모든 것보다 메모리의 다른 부분에있을 가능성이 거의 있습니다. 즉, 캐시 누락을 의미합니다. 3) 컴파일러가 충분히 새로운 경우 작은 문자열 최적화를 받아야합니다. 즉, 스택이 충분히 짧으면 문자열을 할당합니다. 그것은 플라이급보다 큰 차이를 만들 수 있습니다. 하지만 확신하기 위해 몇 가지 테스트를 실행해야합니다. – 0x5453

+0

@ 0x5453에 동의합니다.이 특별한 경우 NUL 종료 문자 배열 (예 :'std :: array ')로 문자열을 저장하면 성능이 가장 좋을 수 있습니다. 물론 그것은 할당의 규모에 따라 다릅니다 – sehe

+0

@ 0x5453 답장을 보내 주셔서 감사합니다. 나는 이것이 답이 아닌 주석이어야한다고 생각한다. :) – CodeNoob

답변

0

플라이급은 매우 일반적이며 구성 가능합니다.

하나의 고정 크기 메모리 풀 (예 : std::vector<CharType>)에서 할당 된 문자열을 사용하는 것이 좋습니다. 그런 다음 보조 저장소의 바이트 범위에 std::string_view 초만 반환하면됩니다.

FlyWeight를 사용하여 그런 것들을 구성 할 수 있지만 데모하려면 시간을 찾아야합니다.

또는 "나만의 방법"으로 할 수 있습니다. I에 유래에서 그 중 일부 샘플이 있습니다

플라이급 나의 경험 (https://stackoverflow.com/search?tab=votes&q=user%3a85371%20flyweight, 예를 들어, boost multi_index_container and slow operator++) 다양했다. Flyweight의 순진한 구현은 거의 원하는 것만은 아닌 것 같습니다. Is it possible to map string to int faster than using hashmap?

+0

완벽한 해시 접근 방식이 추가되었습니다. (¹ 각주에 유의하십시오.) – sehe

관련 문제