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

Smart Pointer Timings

Boost , ,

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

Smart Pointer Timings

В конце января 2000 года Марк Боргердинг выдвинул предложение о создании нового дизайна умного указателя, в котором навязчивый список, связанный вдвойне, используется для объединения всех примеров умных указателей, совместно использующих данный необработанный указатель. Это позволило избежать дорогостоящего выделения кучи отсчета, произошедшего при первоначальном построении тогдашней текущей версии бустера::shared_ptr. Конечно, ничего бесплатного и выгода здесь была получена за счет увеличенных размеров и более затратных копировальных операций. Последовали дебаты по списку рассылки и тестам, которые описаны на этой странице, чтобы предоставить руководство для текущих и будущих исследований стратегий внедрения интеллектуальных указателей.

БлагодарностьДэйв АбрахамсГэвин Коллингс,Грег КолвиниБеман Доусдля тестового кода и пробных реализаций, окончательную версию которых можно найти в формате .zipЗдесь.

Description

Были проведены два испытания: первое было направлено на получение сроков выполнения двух основных отдельных операций:

  1. Первоначальная конструкция из сырого указателя.
  2. Операция амортизированной копии, состоящая из половины задания и половины конструкции копии, предназначенная для отражения среднего использования.

Вторая попытка заключалась в том, чтобы получить более глубокое представление о нормальном использовании с помощью алгоритмов заполнения и сортировки векторов и списков, заполненных различными интеллектуальными указателями.

Были протестированы пять стратегий реализации умных указателей:

  1. Подсчитанный указатель с использованием выделенного числа ссылок, это называетсяпростым подсчитанным.
  2. Подсчитанный указатель с помощью специального целевого распределителя для эталонного счета -специальный подсчитанный.
  3. Подсчитанный указатель с использованием навязчивого подсчета ссылок -.
  4. Связанный указатель, как описано выше -связанный.
  5. Циклический указатель, подсчитанная реализация с использованием std::deque для выделения с обеспечением для слабых указателей и сбором мусора циклов указателей -циклический.

На двух компиляторах:

  1. MSVC 6.0 Service Pack 3, использующий режим оптимизации выпуска по умолчанию (/O2 - оптимизированный для скорости, без указания функций, определенных вне корпуса класса, если не указано как встроенное).
  2. gcc 2.95.2 с использованием полной оптимизации (-O3 -DNDEBUG).

Кроме того, сравнивались сгенерированные размеры указателей (с учетом выравнивания структуры), а также сгенерированные размеры кода для MSVC в основном путем ручного контроля сгенерированного кода сборки - необходимость из-за наложения функций.

Все тесты проводились на PII-200 под управлением Windows NT версии 4.0.

 

Operation Timing Test Results

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

     
  MSVC speed graph  
     
  GCC speed graph  
     

 

Приведение прямых линий к приведенным выше графикам дает следующие цифры для инициализации и амортизированной операции копирования для двух компиляторов (время в наносекундах, ошибки при двух стандартных отклонениях): -

 

MSVC

initialization
copy operation
simple counted
3000 +/- 170 104 +/- 31
special counted
1330 +/- 50 85 +/- 9
intrusive
1000 +/- 20 71 +/- 3
linked 970 +/- 60 136 +/- 10
cyclic 1290 +/- 70 112 +/- 12
dumb 1020 +/- 20 10 +/- 4
raw
1038 +/- 30 10 +/- 5

 

GCC

initialization
copy operation
simple counted
4620 +/- 150 301 +/- 28
special counted
1990 +/- 40 264 +/- 7
intrusive
1590 +/- 70 181 +/- 12
linked 1470 +/- 140 345 +/- 26
cyclic 2180 +/- 100 330 +/- 18
dumb 1590 +/- 70 74 +/- 12
raw
1430 +/- 60 27 +/- 11

Обратите внимание, что вышеупомянутое время включает в себя определенное количество накладных расходов и т. Д. для каждой операции. Оценка чистого «накладного» времени работы умного указателя может быть получена путем вычитания глупой или сырой фигуры из интересующего умного указателя времени.

Detail

Тест включал повторение петли, которая создает необработанные указатели. Затем они были разделены между различными числами (размером набора) умных указателей. Использовался диапазон установленных размеров, а затем линия, установленная для получения линейного отношения с количеством инициализации и копирования операций. Электронная таблица использовалась для подгонки линии и для создания графиков производительности выше.

 

Container Test Results

Чтобы получить некоторое представление о работе в реальных программах, был разработан этот тест. Умные указатели использовались для заполнения стандартных контейнеров, которые затем сортировались.

В этом случае содержащийся указатель указывал на класс, который инициализирует частный элемент данных к случайному значению в его конструкторе по умолчанию. Это значение используется впоследствии для сортировочного сравнительного теста. Класс также содержит интрузивный счетчик ссылок в пользу интрузивного счетного указателя.

Все время в секундах для 300 000 содержащихся указателей.

GCC

  vector list
fill
sort fill sort
simple counted
46.54 2.44 47.09 3.22
special counted
14.02 2.83 7.28 3.21
intrusive
12.15 1.91 7.99 3.08
linked 12.46 2.32 8.14 3.27
cyclic 22.60 3.19 1.63 3.18
raw
11.81 0.24 27.51 0.77

 

MSVC

  vector list
fill
sort fill sort
simple counted
1.83 2.37 1.86 4.85
special counted
1.04 2.35 1.38 4.58
intrusive
1.04 1.84 1.16 4.29
linked 1.08 2.00 1.21 4.33
cyclic 1.38 2.84 1.47 4.73
raw
0.67 0.28 1.24 1.81

 

Code Size

Следующие размеры кода были определены путем проверки сгенерированного кода только для MSVC. Размеры приводятся в форме N/M/I, где:

  • N - количество команд операции
  • M - размер кода в байтах
  • Я определяю, был ли сгенерированный код включен или нет I = inline, O = "outline"

 

ptr()
ptr(p) ptr(ptr) op=()
~ptr()
simple counted
38/110/O 38/110/O 9/23/I 22/57/I 17/40/I
special counted
50/141/O 50/141/O 9/23/I 23/64/I 13/38/I
intrusive
1/2/I 3/6/I 3/6/I 6/11/I 6/11/I
linked
5/19/I 5/15/I 10/30/I 27/59/I 14/38/I

В ходе проверки кода было отмечено несколько незначительных моментов: -

  • Функциональное наложение имело решающее значение для производительности.
  • Для MSVC, по крайней мере, a"удалить 0" вызвало выполнение 11 инструкций по сборке, включая вызов функции. Так что в тех случаях, когда производительность находится на абсолютной премии, может быть целесообразно ввести дополнительный ручной тест.

 

Data Size

Следующие умные размеры указателей были получены в байтах

MSVC
GCC
simple counted
8
8
special counted
8
12
intrusive
4
4
linked
12
12
cyclic
8
8

 

Summary

Результаты синхронизации в основном говорят сами за себя: очевидно, что навязчивый указатель превосходит все остальные, а простой подсчетный указатель на основе кучи имеет плохую производительность по сравнению с другими реализациями. Однако выбор оптимальной неинтрузивной реализации умных указателей более зависит от приложения. В тех случаях, когда ожидается небольшое число экземпляров, вероятно, будет отдано предпочтение связанной реализации. И наоборот, для большего количества копий подсчитанный указатель с каким-то специальным назначением аллокатора выглядит выигрышем. Другие факторы, которые следует иметь в виду:

  • Детерминированный человек, в отличие от амортизированного, оперирует временем. Это взвешивает любую реализацию в зависимости от распределителя.
  • Многопоточная синхронизация. Это соотносится с реализацией, которая распространяет свою информацию, как в случае связанного указателя.

$Date$

Авторское право: Гэвин Коллингс 2000. Разрешение на копирование, использование, изменение, продажу и распространение этого документа предоставляется при условии, что это уведомление об авторских правах появляется во всех копиях. Этот документ предоставляется "как есть" без явной или подразумеваемой гарантии и без претензий относительно его пригодности для любых целей.

Статья Smart Pointer Timings раздела может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:00:47/0.0084700584411621/0