次の Google ベンチマークがあります。
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 を使用する利点は、メモリ バリアが使用されないことであることは理解していますが、構築にはよりコストがかかると予想していました。