Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost.Flyweight Documentation - Performance

Boost , , Boost.Flyweight Documentation - Index

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Boost.Flyweight Performance




Contents

Introduction

Мы показываем, как оценить уменьшение памяти, полученное при использовании Boost. Погрузитесь в определенный сценарий и изучите влияние на время выполнения для различных функциональных областей. Приведены некоторые экспериментальные результаты.

Memory consumption

Как мы видели вучебном обосновании, модель весового веса основана на двух типах объектов:

  • Объектив, кузнечное тело, минарет, миноносец.
  • ,,,,,,.
Общее потребление памяти тогда является функцией размера объектов с массой тела, размера объектов ввода и степени избыточности значения.Собственно весовые объекты, которые имеют очень маленький размер, как правило, указателя.
  • Общие значения, которые хранятся в виде внутреннихзаписейна фабрике по производству веса.
  • The overall memory consumption is then a function of the size of the flyweight objects, the size of the entry objects and the degree of value redundancy. [ORIG_END] -->

    Flyweight size

    Единственным членом данных объекта<flyweight>является так называемаярукоятка, непрозрачный объект небольшого размера, предоставляемый внутренней фабрикой по производству веса для обозначения записей, которые он хранит. По умолчанию<hashed_factory>эта ручка является просто указателем, поэтому<sizeof(flyweight<T>)=sizeof(void*)>4 байта в типичных 32-битных архитектурах. Для других типов фабрик ручка является итератором внутреннего контейнера, используемого при реализации фабрики: опять же, ее размер обычно равен размеру указателя.

    Entry size

    Записи, хранящиеся на заводе, связанные с<flyweight<T,...>>, должны не только содержать значение<T>, но и содержать дополнительную информацию, связанную с внутренней реализацией<flyweight<T,...>>:

    entry = sizeof(T) + overhead.

    Для текущей реализации Boost. Вес, следующие аспекты способствуютнакладные расходы:

    • ,,,,.
    • ,,, [скрыто], [скрыто].
    • Бухгалтерская информация, связанная с транспортом.
    В таблице резюмируются отдельные вклады внакладные расходы, внесенные различными компонентами, участвующими в определении<flyweight>. Значения приведены всловах, т.е. размер указателя, который составляет 4 байта в типичной 32-битной архитектуре. Выравнивание может ввести дополнительные накладные расходы.Использованиеключевых весов.
  • Внутренняя накладная частьфабрикиконтейнера.
  • Бухгалтерская информация, связанная с механизмом отслеживания.
  • The table summarizes the separate contributions to overhead introduced by the different components taking part of the definition of a flyweight instantiation. Values are given in words, i.e. the size of a pointer, which is 4 bytes in a typical 32-bit architecture. Alignment may introduce additional overhead. [ORIG_END] -->

    Entry overhead of the components of Boost.Flyweight.
    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  
    (1) Assuming that sizeof(Key)<=sizeof(Value).
    (2) For some implementations of std::set this overhead reduces to 3.
    (3) In some platforms this value can be 3.

    Например, для параметров конфигурации по умолчанию<flyweight>,накладные расходыобычно составляют 2,5<hashed_factory>+ 2<refcounted>= 4,5 слова.

    Overall memory consumption

    Рассмотрим сценарий, при котором существуют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, то есть, если вообще нет избыточности значений; в этой ситуации нет смысла в первую очередь применять модель веса.

    relative memory consumption of Boost.Flyweight as a function of value diversity
    Fig. 1: Relative memory consumption of Boost.Flyweight as a function of value diversity.

    Time efficiency

    Внедрение модели с весом включает дополнительный уровень опосредованности, который, в целом, приводит к некоторым накладным расходам при доступе к значениям. С другой стороны, манипулирование объектами с массой тела значительно быстрее, чем движение вокруг тяжелых значений, которые они обозначают. Мы качественно анализируем накладные расходы или улучшения, связанные с различными контекстами использования Boost. Весом.

    Initialization

    По сравнению с инициализацией объекта типа<T>, построение<flyweight<T>>выполняет важную дополнительную работу, такую как поиск значения на фабрике и вставка его, если его нет. Так, строительство мухоловок (кроме копировального строительства, которое дешево), как ожидается, будет заметно медленнее, чем строительство базового типа<T>. Однако большую часть времени, затрачиваемого на построение соответствующего<T>значения, можно сэкономить, используявесов с ключевым значением.

    Assignment

    Назначение легковесных объектов чрезвычайно быстро, так как оно включает в себя только назначение типа внутренней ручки, используемой для обозначения общей ценности. Более того, назначение<flyweight>предметов никогда не бросает. Время назначения зависит от типа используемой политики отслеживания; в этом отношении<no_tracking>является самым быстрым вариантом.

    Equality comparison

    Сравнение двух<flyweight>объектов для равенства сводится к проверке того, чтоадресазначений, с которыми они связаны, равны; в общем, эта операция намного быстрее, чем сравнение базовых значений. Этот аспект особенно актуален, когда объекты с массой тела имеют сложные значения, подобные тем, которые возникают при применении.Композиционный рисунок.

    Value access

    Преобразование из<flyweight<T>>в<const T&>зависит от уровня опосредования, связывающего объекты с массой тела с значениями, с которыми они связаны; поэтому ожидается, что доступ к значениям будет медленнее при использовании Boost. Вес по сравнению с использованием связанных значений напрямую. Однако эти накладные расходы могут быть замаскированы косвенным улучшением, вызванным эффектами локализации и кэша: поскольку набор различных<T>значений, обрабатываемых посредством инстанциации<flyweight<T>>, как правило, намного меньше, чем эквивалентное семейство<T>объектов при увеличении. Вес не используется, активные значения лучше вписываются в кэш процессора.

    Experimental results

    Программа профилированиябыла разработана для проверки пространственной и временной эффективности различных инстанциаций<flyweight>против базовой ситуации, не использующей Boost. Весом. Профилированными сценариями являются:

    1. < [62] >.
    2. < [64] >[скрыто]< [65] >< [66] >[скрыто]< [67] >.
    3. >.
    4. >.
    5. <flyweight<std::string,set_factory>,<no_tracking>>.
    6. >
    7. >>[std::string.
    8. flyweight<std::string>с аспектами конфигурации по умолчаниюhashed_factory,refcountedотслеживаниеsimple_locking.
    9. flyweight<std::string,no_tracking>.
    10. flyweight<std::string,set_factory>.
    11. flyweight<std::string,set_factory,no_tracking>.
    [ORIG_END] -->

    На самом деле тестируемые типы — это не те, которые перечислены выше, а инструментальные версии, которые отслеживают выделенную память для целей профилирования. Программа анализирует текстовый файл в массив слов, а затем выполняет различные манипуляции с использованием различных контекстов Boost. Обсуждался лишний весранее. В качестве нашего текстового файла мы использовалипростой текстверсии проекта Гутенберг изданияДон Кихот(2,04 МБ).

    Microsoft Visual C++ 8.0

    Программа была построена с настройками выпуска по умолчанию и<_SECURE_SCL=0>. Тесты проводились под Windows XP на машине, оснащенной процессором Intel Core 2 Duo T5500 и 1 ГБ оперативной памяти.

    Memory

    memory consumption (MB), MSVC++ 8.0
    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% от общей памяти) из-за высокой избыточности слов источника текста.

    Execution time

    execution time (s), MSVC++ 8.0
    Fig. 3: Execution time, MSVC++ 8.0. Values in seconds.

    Фигура отображает время выполнения для профилированных сценариев в различных контекстах использования. В соответствии с нашим предыдущимкачественным анализом, инициализация<flyweight>s несет важные накладные расходы по базовому сценарию (от 20% до 40% дополнительного времени исполнения), в то время как другие контексты использования (назначение, сравнение равенства и доступ к стоимости) имеют прирост производительности, с коэффициентами ускорения более 10 в некоторых случаях. Использование<refcounted>Политика отслеживания вводит санкции в отношении<no_tracking>в инициализации и присвоении, но не имеет никакого эффекта в сравнении равенства и доступе к стоимости.

    GNU GCC 3.4.4

    Использовалась версия компилятора Cygwin/MinGW с опциями команд<-ftemplate-depth-128 -O3 -finline-functions -DNDEBUG>. Испытания проводились под терминалом Cygwin на той же машине, что идо.

    Memory

    memory consumption (MB), GCC 3.4.4
    Fig. 4: Memory consumption, GCC 3.4.4. Values in MB.

    Стандартная библиотека, используемая GCC 3.4.4, реализует<std::string>с использованиемметодов оптимизации копирования на запись, что приводит к очень небольшой избыточности значений для некоторых моделей использования. Это объясняет, почему сокращение памяти достигается с помощью Boost. В этом случае вес очень плохой. Другие контексты, где назначение используется гораздо меньше, чем прямое строительство, будут способствовать росту. Легкий вес над простым копированием на запись<std::string>s.

    Execution time

    execution time (s), GCC 3.4.4
    Fig. 5: Execution time, GCC 3.4.4. Values in seconds.

    Относительные показатели производительности аналогичны показателям, полученным дляMSVC++ 8.0, хотя некоторые из ускорений были достигнуты Boost. Вес здесь выше (×25 в сравнении равенства и до ×100 в назначении, когда<no_tracking>в силе).

    Conclusions

    Введение 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 ::


    реклама


    ©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
    Top.Mail.Ru

    Время компиляции файла: 2024-08-30 11:47:00
    2025-07-04 21:29:13/0.0097329616546631/0