[perf] Optimize HeaderChecker BFS using reserve() This optimization adds breadcrumbs.reserve() to HeaderChecker::IsDependencyOf to reduce the number of rehashes in the visited nodes map during BFS. Performance Impact (Chromium 'gn gen --check' on macOS): - Baseline (origin/main): 66.5s ± 0.4s - With this change: 58.1s ± 0.6s (approx. 13% faster) Bug: 484862257 Change-Id: I4e011f8539e4b2a9343d25f12898a3bc2ab23a93 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/21080 Reviewed-by: Sylvain Defresne <sdefresne@chromium.org> Commit-Queue: David Turner <digit@google.com> Reviewed-by: David Turner <digit@google.com>
diff --git a/src/gn/header_checker.cc b/src/gn/header_checker.cc index 20ed4bc..ea76f2f 100644 --- a/src/gn/header_checker.cc +++ b/src/gn/header_checker.cc
@@ -124,6 +124,7 @@ : build_settings_(build_settings), check_generated_(check_generated), check_system_(check_system), + targets_count_(targets.size()), lock_(), task_count_cv_() { for (auto* target : targets) @@ -592,6 +593,9 @@ // search_for. std::unordered_map<const Target*, ChainLink> breadcrumbs; + if (targets_count_ > 0) { + breadcrumbs.reserve(std::min(targets_count_, static_cast<size_t>(1024))); + } base::queue<ChainLink> work_queue; work_queue.push(ChainLink(search_from, true));
diff --git a/src/gn/header_checker.h b/src/gn/header_checker.h index 0c88149..3f313fb 100644 --- a/src/gn/header_checker.h +++ b/src/gn/header_checker.h
@@ -192,6 +192,8 @@ // execution. base::AtomicRefCount task_count_; + size_t targets_count_ = 0; + // Maps (target_to, target_from) -> is_permitted. enum class DependencyState { kNotADependency,