
On 25 May 2011 00:52, Phil Bouchard <philippe@fornux.com> wrote:
On 5/24/2011 4:07 PM, Nevin Liber wrote:
Your claim is " It is a fast as the popular smart pointer * boost::shared_ptr<T>*". Yet, in single-threaded code and shared_ptr using new instead of make_shared, block_ptr still takes 3.3x as long as shared_ptr.
That is *a lot* of overhead...
I just tested it using make_shared & make_block and I get: make: auto_ptr: 11109841 ns shared_ptr: 21215277 ns block_ptr: 143637475 ns
new: auto_ptr 4583447 ns shared_ptr: 10675000 ns block_ptr: 67152785 ns
FYI make_shared is slower than new because of the temporary it creates. If people what speed they should stick to operator new in all cases.
This is surprising. According to the docs - under "Best Practices" - it suggests using make_shared(), because: [1] "Besides convenience and style, such a function is also exception safe and considerably faster because it can use a single allocation for both the object and its corresponding control block, eliminating a significant portion of shared_ptr's construction overhead. This eliminates one of the major efficiency complaints about shared_ptr." I wonder if it's that your test case prevents your compiler from performing RVO, or that the docs might be incorrect. I wonder what the results look like if you instead test: ``` template <typename T, T (*P)()> void worker_make() { for (int i = 0; i < 100000; ++ i) T p = P(); } ``` -- Darren [1] http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/make_shared.html