Boost logo

Boost :

Subject: Re: [boost] [Block Pointer] benchmark
From: Darren Garvey (darren.garvey_at_[hidden])
Date: 2011-05-24 20:33:27


On 25 May 2011 00:52, Phil Bouchard <philippe_at_[hidden]> 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

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk