diff options
author | Yorick van Pelt <yorick@yorickvanpelt.nl> | 2021-12-27 13:18:55 +0100 |
---|---|---|
committer | Yorick van Pelt <yorick@yorickvanpelt.nl> | 2021-12-27 13:18:55 +0100 |
commit | a4ab0a74d97c7c31df69f04870fa56cde89701a3 (patch) | |
tree | 5ead59578dee00cde7b503a31d537757546c0511 /src/libexpr | |
parent | af553b20902b8b8efbccab5f880879b09e95eb32 (diff) |
Fix accidental O(n^2 * log n) performance in NixRepl::addAttrsToScope
Only sort once, after adding all of the attrs first. This reduces my
`nix repl '<nixpkgs>'` loading time from 1.07s to 103ms.
Fixes #5823
Diffstat (limited to 'src/libexpr')
-rw-r--r-- | src/libexpr/nixexpr.hh | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh index c013f5deb..b328b3941 100644 --- a/src/libexpr/nixexpr.hh +++ b/src/libexpr/nixexpr.hh @@ -368,6 +368,13 @@ struct StaticEnv [](const Vars::value_type & a, const Vars::value_type & b) { return a.first < b.first; }); } + void deduplicate() + { + const auto last = std::unique(vars.begin(), vars.end(), + [] (const Vars::value_type & a, const Vars::value_type & b) { return a.first == b.first; }); + vars.erase(last, vars.end()); + } + Vars::const_iterator find(const Symbol & name) const { Vars::value_type key(name, 0); |