Я внедряю систему, которая хранит и манипулирует множеством повторяющихся коротких строк. Например, цена акций серии. У меня будет много повторяющихся записей о ценах на акции 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
?
Моя главная цель — скорее оптимизация скорости, чем оптимизация памяти, если мне придется выбирать одну.
Flyweight очень универсальный и настраиваемый.
Я бы предложил использовать поддержку строк, выделенных из одного пула памяти фиксированного размера (например, std::vector<CharType>
). Вам тогда нужно будет только вернуться std::string_view
s диапазон байтов в резервном хранилище.
Вы можете использовать FlyWeight для настройки подобных вещей, но мне нужно найти время для демонстрации.
В качестве альтернативы, вы можете «свернуть свое». У меня есть несколько примеров этого на StackOverflow:
Мой опыт работы с Flyweight изменился (https://stackoverflow.com/search?tab=votes&д = Пользователь% 3a85371% 20flyweight, например увеличить multi_index_container и медленный оператор ++). Кажется, что наивная реализация Flyweight редко бывает то, что вы хотите.
ОБНОВИТЬ Просто вспомнил эту связанную демонстрацию, которую я сделал, используя Perfect Hashing для символов тикера NASDAQ: Можно ли отобразить строку в int быстрее, чем при использовании hashmap?
Других решений пока нет …