![]() |
![]() ![]() ![]() ![]() |
![]() |
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 ::
реклама |