2016-10-27 8 views
1

Я реализую систему, которая хранит и обрабатывает множество повторяющихся коротких строк. Например, серия цен акций. У меня будет много повторяющихся записей цен на акции Microsoft:Boost flyweight для коротких строк

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

Я имею в виду использование Boost::Flyweight для оптимизации распределения памяти, строка подстановки/сравнения/копирования стоимость этих небольших повторяющихся имен тикер (например, MSFT в этом дело).

Но дело в том, что эти строки довольно малы для начала - обычно всего несколько байт. В то время как длинный тип - 8 байтов уже на современных компьютерах. Стоит ли использовать Boost::Flyweight в этом случае?

Мое понимание Boost::Flyweight заключается в том, что интернализированные строки являются целыми числами для повышения производительности. Но я думаю, что поиск/сравнение/копирование 8-байтовой строки не будет сильно отличаться от работы с 8-байтным длинным типом данных. Так стоит ли переходить на Boost::Flyweight?

Моя основная цель - это больше на стороне оптимизации скорости, а не на стороне оптимизации памяти, если мне нужно ее выбрать.

+0

Несколько мыслей приходят на ум: 1) Я не знаком с реализацией Boost, но я чувствую, как мухи шаблон в первую очередь предназначен для экономии памяти, а не для скорости. 2) Не забывайте о локальности кеша. Мухи почти наверняка будут в другой части памяти, чем все остальное, с которыми вы работаете «локально», а это значит, что промахи в кеше. 3) Если ваш компилятор достаточно новый, вы должны получить небольшую оптимизацию строк, которая выделяет строки в стеке, если они достаточно коротки. Это может иметь большее значение, чем мухи. Но я думаю, что вы должны выполнить некоторые тесты, чтобы быть уверенными. – 0x5453

+0

Я согласен с @ 0x5453, что в этом конкретном случае сохранение строк в виде массивов символов с нулевым символом (например, 'std :: array ') может быть лучшим для производительности. Конечно, это зависит от масштаба распределения – sehe

+0

@ 0x5453 спасибо за ваш ответ. Я чувствую, что это должен быть ответ, а не комментарий. :) – CodeNoob

ответ

0

Flyweight очень общий и настраиваемый.

Я бы предложил использовать поддержку строк, выделенных из одного пула памяти фиксированного размера (например, std::vector<CharType>). Затем вам нужно было бы вернуть std::string_view s в диапазон байтов в хранилище резервных копий.

Вы можете использовать FlyWeight для настройки таких вещей, но мне нужно найти время для демонстрации.

В качестве альтернативы вы можете «перевернуть свои собственные». У меня есть некоторые образцы, которые на StackOverflow:

Мой опыт работы с Наименьший вес варьировался (https://stackoverflow.com/search?tab=votes&q=user%3a85371%20flyweight, например boost multi_index_container and slow operator++). Похоже, что наивная реализация Flyweight редко вам нужна.

UPDATE Просто вспомнил этот связанный демо я сделал с помощью Совершенная хеширование для NASDAQ символов тикер: Is it possible to map string to int faster than using hashmap?

+0

Добавлен идеальный подход к хэшу. (Также прислушайтесь к сноске ¹) – sehe