mirror of
https://github.com/abseil/abseil-cpp.git
synced 2026-06-04 20:14:23 +08:00
-- f4c7e510922668c68be4aa79a00867c3d3ca9f95 by Derek Mauro <dmauro@google.com>: Many improvements to LeakChecker builds The presence of the LeakChecker is now detected when possible. GCC users using LeakChecker in standalone mode still need to use -DLEAK_CHECKER. This is now documented in the header. The hacky targets used for testing leak checking have been removed in favor of testing in AddressSanitizer mode on Kokoro. Fixes #885 Fixes #1153 PiperOrigin-RevId: 441203393 Change-Id: Ibe64ef6b104bcaf31839ff7184e558cc86abdd1c -- 5c70a23aa83b8152ab95d2cf21662fc63c80ef7d by Abseil Team <absl-team@google.com>: Add a benchmark for stacktrace PiperOrigin-RevId: 441196473 Change-Id: I4c9aa2e797aa2cae09abfaaee3abe5c09eb62fc4 -- 50b406052273b9d5bad04a7860a96e4d5d956c02 by Abseil Team <absl-team@google.com>: Internal change. PiperOrigin-RevId: 441114481 Change-Id: I667af7a50d5631ca91289dd24c91ba90233e0184 -- 568b4eaac120b420bce5290179d407d2b57d5bae by Dino Radakovic <dinor@google.com>: Internal change PiperOrigin-RevId: 440894155 Change-Id: Ia587ffc65a8321126585fb363b7c0ca8cc2a0da2 -- d53948eace4f3a10ac5a6c1496dc51b81adc412c by Abseil Team <absl-team@google.com>: Explicitly give internal linkage to symbols which are not used outside of their translation units. PiperOrigin-RevId: 440424519 Change-Id: I531c5e229d443375483b7550a34f48042589a99b GitOrigin-RevId: f4c7e510922668c68be4aa79a00867c3d3ca9f95
56 lines
1.7 KiB
C++
56 lines
1.7 KiB
C++
// Copyright 2022 The Abseil Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// https://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "absl/base/attributes.h"
|
|
#include "absl/base/config.h"
|
|
#include "absl/base/optimization.h"
|
|
#include "absl/debugging/stacktrace.h"
|
|
#include "benchmark/benchmark.h"
|
|
|
|
namespace absl {
|
|
ABSL_NAMESPACE_BEGIN
|
|
namespace {
|
|
|
|
static constexpr int kMaxStackDepth = 100;
|
|
static constexpr int kCacheSize = (1 << 16);
|
|
void* pcs[kMaxStackDepth];
|
|
|
|
ABSL_ATTRIBUTE_NOINLINE void func(benchmark::State& state, int x, int depth) {
|
|
if (x <= 0) {
|
|
// Touch a significant amount of memory so that the stack is likely to be
|
|
// not cached in the L1 cache.
|
|
state.PauseTiming();
|
|
int* arr = new int[kCacheSize];
|
|
for (int i = 0; i < kCacheSize; ++i) benchmark::DoNotOptimize(arr[i] = 100);
|
|
delete[] arr;
|
|
state.ResumeTiming();
|
|
benchmark::DoNotOptimize(absl::GetStackTrace(pcs, depth, 0));
|
|
return;
|
|
}
|
|
ABSL_BLOCK_TAIL_CALL_OPTIMIZATION();
|
|
func(state, --x, depth);
|
|
}
|
|
|
|
void BM_GetStackTrace(benchmark::State& state) {
|
|
int depth = state.range(0);
|
|
for (auto s : state) {
|
|
func(state, depth, depth);
|
|
}
|
|
}
|
|
|
|
BENCHMARK(BM_GetStackTrace)->DenseRange(10, kMaxStackDepth, 10);
|
|
} // namespace
|
|
ABSL_NAMESPACE_END
|
|
} // namespace absl
|