У меня есть следующий Google Benchmark:
void SharedPtrUsingNew(benchmark::State & state)
{
while (state.KeepRunning())
{
benchmark::DoNotOptimize(make_shared<MediumSizeData>());
}
}
void LocalSharedPtrUsingNew(benchmark::State & state)
{
while (state.KeepRunning())
{
benchmark::DoNotOptimize(make_local_shared<MediumSizeData>());
}
}
А также вариация:
void SharedPtrUsingNew(benchmark::State & state)
{
while (state.KeepRunning())
{
benchmark::DoNotOptimize(shared_ptr<MediumSizeData>(new MediumSizeData));
}
}
void LocalSharedPtrUsingNew(benchmark::State & state)
{
while (state.KeepRunning())
{
benchmark::DoNotOptimize(local_shared_ptr<MediumSizeData>(new MediumSizeData));
}
}
И результаты:
Run on (40 X 2195 MHz CPU s)
CPU Caches:
L1 Data 32K (x20)
L1 Instruction 32K (x20)
L2 Unified 1048K (x20)
L3 Unified 14417K (x2)
----------------------------------------------------------------------------
Benchmark Time CPU Iterations
----------------------------------------------------------------------------
SharedPtrUsingNew 125 ns 126 ns 5600000
LocalSharedPtrUsingNew 154 ns 157 ns 4480000
2nd variation:
SharedPtrUsingNew 183 ns 181 ns 3200000
LocalSharedPtrUsingNew 243 ns 246 ns 2986667
Это с boost 1.72 и Visual C ++ 2019 16.5.4.
Я понимаю, что преимущества использования local_shared_ptr состоят в том, что не будет использоваться барьер памяти, но я ожидал, что конструкция будет более дорогой.