Я широко использую 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&)
Я немного озадачен тем, что количество вызовов деструкторов меньше количества вызовов конструктора копирования, но в целом я очень рад уменьшению связанного времени выполнения.Спасибо всем за советы.