1851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej//===----------------------------------------------------------------------===//
2851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej//
3851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej//                     The LLVM Compiler Infrastructure
4851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej//
5851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej// This file is dual licensed under the MIT and the University of Illinois Open
6851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej// Source Licenses. See LICENSE.TXT for details.
7851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej//
8851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej//===----------------------------------------------------------------------===//
9851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej
10851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej#include <memory>
11851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej
12fd2e3e98c1decf5bc600b5962cbbbe8374b5cd3eEric Fiselier#include "benchmark/benchmark.h"
13851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej
14851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavejstatic void BM_SharedPtrCreateDestroy(benchmark::State& st) {
15851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej  while (st.KeepRunning()) {
16851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej    auto sp = std::make_shared<int>(42);
17851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej    benchmark::DoNotOptimize(sp.get());
18851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej  }
19851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej}
20851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. LavavejBENCHMARK(BM_SharedPtrCreateDestroy);
21851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej
22851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavejstatic void BM_SharedPtrIncDecRef(benchmark::State& st) {
23851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej  auto sp = std::make_shared<int>(42);
24851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej  benchmark::DoNotOptimize(sp.get());
25851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej  while (st.KeepRunning()) {
26851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej    std::shared_ptr<int> sp2(sp);
27851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej    benchmark::ClobberMemory();
28851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej  }
29851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej}
30851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. LavavejBENCHMARK(BM_SharedPtrIncDecRef);
31851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej
32851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavejstatic void BM_WeakPtrIncDecRef(benchmark::State& st) {
33851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej  auto sp = std::make_shared<int>(42);
34851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej  benchmark::DoNotOptimize(sp.get());
35851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej  while (st.KeepRunning()) {
36851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej    std::weak_ptr<int> wp(sp);
37851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej    benchmark::ClobberMemory();
38851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej  }
39851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej}
40851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. LavavejBENCHMARK(BM_WeakPtrIncDecRef);
41851ea6e01a3960f33a3fae43e1ff08eefb6b4d10Stephan T. Lavavej
42fd2e3e98c1decf5bc600b5962cbbbe8374b5cd3eEric FiselierBENCHMARK_MAIN();
43