Use unordered_map instead of map in HeaderChecker Also use emplace instead of insert to optimize performance. With this CL, `gn gen --check` takes 120 seconds. ``` tikuta-mac:src tikuta$ time ~/ghq/gn.googlesource.com/gn/out/gn.optimized gen --check -C out/UTRmac-rel/ Done. Made 38392 targets from 4274 files in 119262ms real 1m59.941s user 15m7.501s sys 0m14.056s ``` Without this CL, `gn gen --check` takes 126 seconds. ``` tikuta-mac:src tikuta$ time ~/ghq/gn.googlesource.com/gn/out/gn gen --check -C out/UTRmac-rel/ Done. Made 38392 targets from 4274 files in 125567ms real 2m6.297s user 16m6.596s sys 0m12.044s ``` Context: https://chat.google.com/room/AAAAqkI-BEQ/g5GWL0SzKBI/g5GWL0SzKBI?cls=10 Change-Id: Ia8c4596c8301b76a916cb11c18171215d67eab1e Reviewed-on: https://gn-review.googlesource.com/c/gn/+/20260 Commit-Queue: Takuto Ikuta <tikuta@google.com> Reviewed-by: David Turner <digit@google.com>
diff --git a/src/gn/header_checker.cc b/src/gn/header_checker.cc index 05c74d6..1ecc90a 100644 --- a/src/gn/header_checker.cc +++ b/src/gn/header_checker.cc
@@ -5,6 +5,7 @@ #include "gn/header_checker.h" #include <algorithm> +#include <unordered_map> #include "base/containers/queue.h" #include "base/files/file_util.h" @@ -561,7 +562,7 @@ // a shortest dependency chain (in reverse order) from search_from to // search_for. - std::map<const Target*, ChainLink> breadcrumbs; + std::unordered_map<const Target*, ChainLink> breadcrumbs; base::queue<ChainLink> work_queue; work_queue.push(ChainLink(search_from, true)); @@ -585,7 +586,7 @@ // Always consider public dependencies as possibilities. for (const auto& dep : target->public_deps()) { - if (breadcrumbs.insert(std::make_pair(dep.ptr, cur_link)).second) + if (breadcrumbs.emplace(dep.ptr, cur_link).second) work_queue.push(ChainLink(dep.ptr, true)); } @@ -596,7 +597,7 @@ // public/private-ness. first_time = false; for (const auto& dep : target->private_deps()) { - if (breadcrumbs.insert(std::make_pair(dep.ptr, cur_link)).second) + if (breadcrumbs.emplace(dep.ptr, cur_link).second) work_queue.push(ChainLink(dep.ptr, false)); } }