Boost flyweight для коротких струн
Я внедряю систему, которая хранит и манипулирует множеством повторяющихся коротких строк. Например, цена акций серии. У меня будет много повторяющихся записей о ценах на акции Microsoft:
<time1>,MSFT,60.01
<time2>,MSFT,60.02
<time3>,MSFT,60.00
Я думаю об использовании Boost::Flyweight
чтобы оптимизировать выделение памяти, стоимость поиска / сравнения / копирования строк этих небольших повторяющихся имен тикеров (например, MSFT в данном случае).
Но дело в том, что эти строки довольно малы - обычно всего несколько байтов. Пока длинный тип составляет 8 байт уже в современных компьютерах. Стоит ли использовать Boost::Flyweight
в этом случае?
Мое понимание Boost::Flyweight
заключается в том, что внутренние строки являются целыми числами для повышения производительности. Но я думаю, что поиск / сравнение / копирование 8-байтовой строки не сильно отличается от работы с 8-байтовым типом данных. Так стоит ли переходить к Boost::Flyweight
?
Моя главная цель - скорее оптимизация скорости, чем оптимизация памяти, если мне придется выбирать одну.
1 ответ
Flyweight очень универсальный и настраиваемый.
Я бы предложил использовать поддержку строк, выделенных из одного пула памяти фиксированного размера (например, std::vector<CharType>
). Вам тогда нужно будет только вернуться std::string_view
s диапазон байтов в резервном хранилище.
Вы можете использовать FlyWeight для настройки подобных вещей, но мне нужно найти время для демонстрации.
В качестве альтернативы, вы можете "свернуть свое". У меня есть несколько примеров этого на Stackru:
- Как улучшить производительность улучшенных поисков interval_map
- Реализация "пула строк", который гарантированно не перемещается
Мой опыт работы с Flyweight варьируется ( https://stackru.com/search?tab=votes&q=user%3A85371%20flyweight, например, boost multi_index_container и slow operator ++). Кажется, что наивная реализация Flyweight редко бывает то, что вы хотите.
ОБНОВЛЕНИЕ Только что вспомнил эту связанную демонстрацию, которую я сделал, используя Perfect Hashing для символов тикера NASDAQ: возможно ли отобразить строку в int быстрее, чем при использовании hashmap?