0

Mark ObserverList DCHECK stacks as expensive

This puts ObserverList StackTrace gathering under
EXPENSIVE_DCHECKS_ARE_ON() to be able to selectively exclude them
without disabling DCHECKs.

Anecdotal data (off-the-tracker) suggest that this is one of the top-10
overheads for running with DCHECKs right now.

Bug: None
Change-Id: Ife3cbc4326d84f8af1e3ea67e94791a02e35b304
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3017493
Reviewed-by: danakj <danakj@chromium.org>
Commit-Queue: Peter Boström <pbos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#900121}
This commit is contained in:
Peter Boström
2021-07-09 20:24:16 +00:00
committed by Chromium LUCI CQ
parent ba6ecee942
commit 51b93219e5
2 changed files with 9 additions and 6 deletions

@ -336,14 +336,17 @@ class ObserverList {
} }
std::string GetObserversCreationStackString() const { std::string GetObserversCreationStackString() const {
#if EXPENSIVE_DCHECKS_ARE_ON()
std::string result; std::string result;
#if DCHECK_IS_ON()
for (const auto& observer : observers_) { for (const auto& observer : observers_) {
result += observer.GetCreationStackString(); result += observer.GetCreationStackString();
result += "\n"; result += "\n";
} }
#endif
return result; return result;
#else
return "For observer stack traces, build with "
"`enable_expensive_dchecks=true`.";
#endif // EXPENSIVE_DCHECKS_ARE_ON()
} }
std::vector<ObserverStorageType> observers_; std::vector<ObserverStorageType> observers_;

@ -42,15 +42,15 @@ class BASE_EXPORT UncheckedObserverAdapter {
return static_cast<ObserverType*>(adapter.ptr_); return static_cast<ObserverType*>(adapter.ptr_);
} }
#if DCHECK_IS_ON() #if EXPENSIVE_DCHECKS_ARE_ON()
std::string GetCreationStackString() const { return stack_.ToString(); } std::string GetCreationStackString() const { return stack_.ToString(); }
#endif #endif // EXPENSIVE_DCHECKS_ARE_ON()
private: private:
void* ptr_; void* ptr_;
#if DCHECK_IS_ON() #if EXPENSIVE_DCHECKS_ARE_ON()
base::debug::StackTrace stack_; base::debug::StackTrace stack_;
#endif #endif // EXPENSIVE_DCHECKS_ARE_ON()
}; };
// Adapter for CheckedObserver types so that they can use the same syntax as a // Adapter for CheckedObserver types so that they can use the same syntax as a