![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Boost.Flyweight Documentation - PerformanceBoost , , Boost.Flyweight Documentation - Index
|
component | overhead (words) | |
---|---|---|
key_value |
with key extractor | 1(1) |
without key extractor | 1 + sizeof(Key) |
|
factory | hashed_factory |
~2.5 |
set_factory |
4(2) | |
assoc_container_factory |
depends on the container used | |
tracking mechanism | refcounted |
2(3) |
no_tracking |
0 |
sizeof(Key)<=sizeof(Value)
.std::set
this overhead reduces to 3.Например, для параметров конфигурации по умолчанию<flyweight
>,накладные расходыобычно составляют 2,5<hashed_factory
>+ 2<refcounted
>= 4,5 слова.
Рассмотрим сценарий, при котором существуютNразличные объекты типа<T
>, совместно принимающиеMразные значения. Затем объекты потребляютS=N·Tбайты, гдеTопределяется как средний размер<T
><sizeof(T)
>плюс динамическая память, выделенная<T
>объектами. Если мы заменим<T
>каким-то моментом<flyweight<T,...>
>, то в результате потребление памяти будет
SF = N·P + M·(T + overhead),
гдеP—<sizeof(flyweight<T,...>)
>, обычно равный<sizeof(void*)
>, как виднодо. СоотношениеSF/S
SF / S = (P / T)+ (M / N)(1 + overhead / T).
SF/Sимеет тенденцию к своему минимуму,P/T, так какM/Nимеет тенденцию к 0, т.е. когда степень избыточности значений среди<T
>объектов возрастает. С другой стороны, наихудший возможный случайSF/S= 1 +P+накладные расходы/Tпроисходит, когдаM/N= 1, то есть, если вообще нет избыточности значений; в этой ситуации нет смысла в первую очередь применять модель веса.
Fig. 1: Relative memory consumption of Boost.Flyweight as a function of value diversity.
Внедрение модели с весом включает дополнительный уровень опосредованности, который, в целом, приводит к некоторым накладным расходам при доступе к значениям. С другой стороны, манипулирование объектами с массой тела значительно быстрее, чем движение вокруг тяжелых значений, которые они обозначают. Мы качественно анализируем накладные расходы или улучшения, связанные с различными контекстами использования Boost. Весом.
По сравнению с инициализацией объекта типа<T
>, построение<flyweight<T>
>выполняет важную дополнительную работу, такую как поиск значения на фабрике и вставка его, если его нет. Так, строительство мухоловок (кроме копировального строительства, которое дешево), как ожидается, будет заметно медленнее, чем строительство базового типа<T
>. Однако большую часть времени, затрачиваемого на построение соответствующего<T
>значения, можно сэкономить, используявесов с ключевым значением.
Назначение легковесных объектов чрезвычайно быстро, так как оно включает в себя только назначение типа внутренней ручки, используемой для обозначения общей ценности. Более того, назначение<flyweight
>предметов никогда не бросает. Время назначения зависит от типа используемой политики отслеживания; в этом отношении<no_tracking
>является самым быстрым вариантом.
Сравнение двух<flyweight
>объектов для равенства сводится к проверке того, чтоадресазначений, с которыми они связаны, равны; в общем, эта операция намного быстрее, чем сравнение базовых значений. Этот аспект особенно актуален, когда объекты с массой тела имеют сложные значения, подобные тем, которые возникают при применении.Композиционный рисунок.
Преобразование из<flyweight<T>
>в<const T&
>зависит от уровня опосредования, связывающего объекты с массой тела с значениями, с которыми они связаны; поэтому ожидается, что доступ к значениям будет медленнее при использовании Boost. Вес по сравнению с использованием связанных значений напрямую. Однако эти накладные расходы могут быть замаскированы косвенным улучшением, вызванным эффектами локализации и кэша: поскольку набор различных<T
>значений, обрабатываемых посредством инстанциации<flyweight<T>
>, как правило, намного меньше, чем эквивалентное семейство<T
>объектов при увеличении. Вес не используется, активные значения лучше вписываются в кэш процессора.
Программа профилированиябыла разработана для проверки пространственной и временной эффективности различных инстанциаций<flyweight
>против базовой ситуации, не использующей Boost. Весом. Профилированными сценариями являются:
flyweight<std::string,set_factory
>,<no_tracking
>>
.std::string
.
flyweight<std::string>
с аспектами конфигурации по умолчаниюhashed_factory
,refcounted
отслеживаниеsimple_locking
.flyweight<std::string,no_tracking
>
.flyweight<std::string,set_factory
>
.flyweight<std::string,set_factory
,no_tracking
>
.На самом деле тестируемые типы — это не те, которые перечислены выше, а инструментальные версии, которые отслеживают выделенную память для целей профилирования. Программа анализирует текстовый файл в массив слов, а затем выполняет различные манипуляции с использованием различных контекстов Boost. Обсуждался лишний весранее. В качестве нашего текстового файла мы использовалипростой текстверсии проекта Гутенберг изданияДон Кихот(2,04 МБ).
Программа была построена с настройками выпуска по умолчанию и<_SECURE_SCL=0
>. Тесты проводились под Windows XP на машине, оснащенной процессором Intel Core 2 Duo T5500 и 1 ГБ оперативной памяти.
Fig. 2: Memory consumption, MSVC++ 8.0. Values in MB.
Результаты показывают показатели потребления памяти для различных профилированных сценариев. Реализация стандартной библиотеки MSVC++ 8.0 имеет так называемую оптимизацию малого буфера для струн, посредством которой<std::string
>объекты удерживают небольшой буфер, который может использоваться, когда струна короткая, таким образом, вызывая динамические распределения. Это приводит к тому, что<sizeof(std::string)
>довольно высокий, 28 байт. В нашем конкретном тесте строки почти всегда удерживаются в небольшом буфере, поэтому минимальныйSF/Sдостижим 4/28 = 14,3%, что довольно близко к экспериментальным результатам, учитывая, что память, посвященная хранению общих значений, является остаточной (около 3% от общей памяти) из-за высокой избыточности слов источника текста.
Fig. 3: Execution time, MSVC++ 8.0. Values in seconds.
Фигура отображает время выполнения для профилированных сценариев в различных контекстах использования. В соответствии с нашим предыдущимкачественным анализом, инициализация<flyweight
>s несет важные накладные расходы по базовому сценарию (от 20% до 40% дополнительного времени исполнения), в то время как другие контексты использования (назначение, сравнение равенства и доступ к стоимости) имеют прирост производительности, с коэффициентами ускорения более 10 в некоторых случаях. Использование<refcounted
>Политика отслеживания вводит санкции в отношении<no_tracking
>в инициализации и присвоении, но не имеет никакого эффекта в сравнении равенства и доступе к стоимости.
Использовалась версия компилятора Cygwin/MinGW с опциями команд<-ftemplate-depth-128 -O3 -finline-functions -DNDEBUG
>. Испытания проводились под терминалом Cygwin на той же машине, что идо.
Fig. 4: Memory consumption, GCC 3.4.4. Values in MB.
Стандартная библиотека, используемая GCC 3.4.4, реализует<std::string
>с использованиемметодов оптимизации копирования на запись, что приводит к очень небольшой избыточности значений для некоторых моделей использования. Это объясняет, почему сокращение памяти достигается с помощью Boost. В этом случае вес очень плохой. Другие контексты, где назначение используется гораздо меньше, чем прямое строительство, будут способствовать росту. Легкий вес над простым копированием на запись<std::string
>s.
Fig. 5: Execution time, GCC 3.4.4. Values in seconds.
Относительные показатели производительности аналогичны показателям, полученным дляMSVC++ 8.0, хотя некоторые из ускорений были достигнуты Boost. Вес здесь выше (×25 в сравнении равенства и до ×100 в назначении, когда<no_tracking
>в силе).
Введение Boost. Вес в сценариях применения с очень высокой избыточностью значений приводит к значительному снижению потребления памяти: это особенно актуально, когда объем данных приближается к пределам физической памяти в машине, так как увеличивается. Flyweight может избежать потери виртуальной памяти, что делает приложение жизнеспособным. Мы показали, как можно оценить достижимое сокращение потребления памяти из некоторых базовых статистических данных и знаний об используемых аспектах конфигурации<flyweight
>.
Повышаю. Flyweight также может ускорить время выполнения в областях, отличных от инициализации объекта, из-за быстрых манипуляций с малыми объектами, а также из-за резкого сокращения набора выделенных значений.
Пересмотрено 1 сентября 2014 года
© Copyright 2006-2014 Joaquín M López Muñoz. Распространяется под лицензией Boost Software License, версия 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию на) http://www.boost.org/LICENSE_1_0.txt
Статья Boost.Flyweight Documentation - Performance раздела Boost.Flyweight Documentation - Index может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Boost.Flyweight Documentation - Index ::
реклама |