Performance test of shared_ptr, ptr_vector, cow_ptr, and copy_ptr

I'm doing performance test comparing different containers of smart pointers to the boost pointer containers.
From my test, it does seem that boost::ptr_vector does seem to do a much better job of populating the container than does a std::vector container of boost::shared_ptr, cow_ptr, and copy_ptr.
I was really surprise to find out that ptr_vector was 2 to 3 times faster than vector<cow_ptr<T> >, but I was even more surprise to find that it was also 2 to 3 times faster than vector<shared_ptr<T> >. In fact, even the copy_ptr was twice as fast as the boost::shared_ptr and cow_ptr in populating the container. It seems reference counting has a much bigger impact on performance than I had anticipated. Can someone else run this test on a different platform, to see if they get similar results: I used the following code: http://code.axter.com/copy_ptr.h http://code.axter.com/cow_ptr.h http://code.axter.com/shape_test.h http://code.axter.com/boost_ptr_containers/main.cpp My test was done on Windows XP Pro and 2003 Server. I used VC++ 7.1 Here's an example of one of the results I'm getting: vector<copy_ptr<Shape> > 1.30 s boost::ptr_vector<Shape> 0.88 s vector<cow_ptr<Shape> > 3.31 s vector<boost::shared_ptr<Shape> > 2.97 s vector<copy_ptr<Shape> > 1.19 s boost::ptr_vector<Shape> 0.67 s vector<cow_ptr<Shape> > 3.25 s vector<boost::shared_ptr<Shape> > 2.92 s I believe the performance hit is coming from having to call new on the constructor. I'm wondering if there's a more efficient way to do reference counting that can avoid calling new.

David Maisonave wrote:
I believe the performance hit is coming from having to call new on the constructor. I'm wondering if there's a more efficient way to do reference counting that can avoid calling new.
Well... there are 1. intrusive_ptr 2. #define BOOST_SP_USE_QUICK_ALLOCATOR 3. dlmalloc 4. not calling reserve to make copy_ptr look worse :-)

"David Maisonave" <dmaisonave@commvault.com> wrote:
In fact, even the copy_ptr was twice as fast as the boost::shared_ptr and cow_ptr in populating the container.
It seems reference counting has a much bigger impact on performance than I had anticipated.
It might not be the reference counting itself but more the fact that shared_ptr needs to allocate the counter object using "new" for every created object. Using intrusive_ptr instead would avoid this issue. It might also make a difference if you have BOOST_SP_USE_QUICK_ALLOCATOR defined. -- Catalin
participants (3)
-
Catalin Marinas
-
David Maisonave
-
Peter Dimov