Я использую std:: tr1:: shared_ptr широко в моем приложении. Это включает в себя передачу объектов в качестве аргументов функции. Рассмотрим следующее:
class Dataset {...}
void f( shared_ptr< Dataset const > pds ) {...}
void g( shared_ptr< Dataset const > pds ) {...}
...
При передаче объекта набора данных через shared_ptr обеспечивается его существование внутри f и g, функции могут быть вызваны миллионы раз, что приводит к созданию и уничтожению большого количества объектов shared_ptr. Вот фрагмент плоского профиля gprof из недавнего прогона:
Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 9.74 295.39 35.12 2451177304 0.00 0.00 std::tr1::__shared_count::__shared_count(std::tr1::__shared_count const&) 8.03 324.34 28.95 2451252116 0.00 0.00 std::tr1::__shared_count::~__shared_count()
Итак, ~ 17% времени выполнения было потрачено на подсчет ссылок с объектами shared_ptr. Это нормально?
Большая часть моего приложения однопоточная, и я думал о повторной записи некоторых функций в виде
void f( const Dataset& ds ) {...}
и заменяя вызовы
shared_ptr< Dataset > pds( new Dataset(...) );
f( pds );
с
f( *pds );
в тех местах, где я точно знаю, что объект не будет уничтожен, а поток программы внутри f(). Но прежде чем я убегу изменить группу сигнатур/звонков, мне хотелось узнать, что типичное поражение производительности при передаче shared_ptr было. Похоже, что shared_ptr не следует использовать для функций, вызываемых очень часто.
Любой ввод будет оценен. Спасибо за чтение.
-Artem
Обновление:. После изменения нескольких функций для принятия const Dataset&
новый профиль выглядит следующим образом:
Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 0.15 241.62 0.37 24981902 0.00 0.00 std::tr1::__shared_count::~__shared_count() 0.12 241.91 0.30 28342376 0.00 0.00 std::tr1::__shared_count::__shared_count(std::tr1::__shared_count const&)
Я немного озадачен количеством вызовов деструкторов, которые меньше, чем количество вызовов конструктора копий, но в целом я очень доволен уменьшением связанного времени выполнения. Спасибо всем за их советы.