![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Smart Pointer TimingsBoost , ,
|
![]() |
||
![]() |
||
Приведение прямых линий к приведенным выше графикам дает следующие цифры для инициализации и амортизированной операции копирования для двух компиляторов (время в наносекундах, ошибки при двух стандартных отклонениях): -
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 |
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 |
Обратите внимание, что вышеупомянутое время включает в себя определенное количество накладных расходов и т. Д. для каждой операции. Оценка чистого «накладного» времени работы умного указателя может быть получена путем вычитания глупой или сырой фигуры из интересующего умного указателя времени.
Тест включал повторение петли, которая создает необработанные указатели. Затем они были разделены между различными числами (размером набора) умных указателей. Использовался диапазон установленных размеров, а затем линия, установленная для получения линейного отношения с количеством инициализации и копирования операций. Электронная таблица использовалась для подгонки линии и для создания графиков производительности выше.
Чтобы получить некоторое представление о работе в реальных программах, был разработан этот тест. Умные указатели использовались для заполнения стандартных контейнеров, которые затем сортировались.
В этом случае содержащийся указатель указывал на класс, который инициализирует частный элемент данных к случайному значению в его конструкторе по умолчанию. Это значение используется впоследствии для сортировочного сравнительного теста. Класс также содержит интрузивный счетчик ссылок в пользу интрузивного счетного указателя.
Все время в секундах для 300 000 содержащихся указателей.
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 |
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 |
Следующие размеры кода были определены путем проверки сгенерированного кода только для MSVC. Размеры приводятся в форме N/M/I, где:
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
|
GCC
|
|
---|---|---|
simple counted
|
8
|
8
|
special counted
|
8
|
12
|
intrusive
|
4
|
4
|
linked
|
12
|
12
|
cyclic
|
8
|
8
|
Результаты синхронизации в основном говорят сами за себя: очевидно, что навязчивый указатель превосходит все остальные, а простой подсчетный указатель на основе кучи имеет плохую производительность по сравнению с другими реализациями. Однако выбор оптимальной неинтрузивной реализации умных указателей более зависит от приложения. В тех случаях, когда ожидается небольшое число экземпляров, вероятно, будет отдано предпочтение связанной реализации. И наоборот, для большего количества копий подсчитанный указатель с каким-то специальным назначением аллокатора выглядит выигрышем. Другие факторы, которые следует иметь в виду:
$Date$
Авторское право: Гэвин Коллингс 2000. Разрешение на копирование, использование, изменение, продажу и распространение этого документа предоставляется при условии, что это уведомление об авторских правах появляется во всех копиях. Этот документ предоставляется "как есть" без явной или подразумеваемой гарантии и без претензий относительно его пригодности для любых целей.
Статья Smart Pointer Timings раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: ::
реклама |