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));
}
}