Почему создание boost :: local_shared_ptr медленнее, чем создание std :: shared_ptr в VC ++? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть следующий 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 состоят в том, что не будет использоваться барьер памяти, но я ожидал, что конструкция будет более дорогой.

...