Skip to content

Commit 8a3a773

Browse files
Ericson2314Ma27lovesegfault
committed
perf(libstore/derivation-builder): pre-compute outputGraph for linear complexity
Build the inverse of `scratchOuputs` before running topoSort, avoiding quadratic complexity when determining which outputs reference each other. This fixes the FIXME comment about building the inverted map up front. Inspired by Lix commit 10c04ce84 / Change Id Ibdd46e7b2e895bfeeebc173046d1297b41998181, but ended up being completely different code. Co-Authored-By: Maximilian Bosch <[email protected]> Co-Authored-By: Bernardo Meurer Costa <[email protected]>
1 parent 423e732 commit 8a3a773

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

src/libstore/unix/build/derivation-builder.cc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,6 +1398,11 @@ SingleDrvOutputs DerivationBuilderImpl::registerOutputs()
13981398
StorePathSet refs;
13991399
};
14001400

1401+
/* inverse map of scratchOutputs for efficient lookup */
1402+
std::map<StorePath, std::string> scratchOutputsInverse;
1403+
for (auto & [outputName, path] : scratchOutputs)
1404+
scratchOutputsInverse.insert_or_assign(path, outputName);
1405+
14011406
std::map<std::string, std::variant<AlreadyRegistered, PerhapsNeedToRegister>> outputReferencesIfUnregistered;
14021407
std::map<std::string, struct stat> outputStats;
14031408
for (auto & [outputName, _] : drv.outputs) {
@@ -1486,11 +1491,9 @@ SingleDrvOutputs DerivationBuilderImpl::registerOutputs()
14861491
[&](const AlreadyRegistered &) { return StringSet{}; },
14871492
[&](const PerhapsNeedToRegister & refs) {
14881493
StringSet referencedOutputs;
1489-
/* FIXME build inverted map up front so no quadratic waste here */
14901494
for (auto & r : refs.refs)
1491-
for (auto & [o, p] : scratchOutputs)
1492-
if (r == p)
1493-
referencedOutputs.insert(o);
1495+
if (auto * o = get(scratchOutputsInverse, r))
1496+
referencedOutputs.insert(*o);
14941497
return referencedOutputs;
14951498
},
14961499
},

0 commit comments

Comments
 (0)