reduce copies during drv parsing

many paths need not be heap-allocated, and derivation env name/valye
pairs can be moved into the map.

before:

Benchmark 1: nix eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'
  Time (mean ± σ):      6.883 s ±  0.016 s    [User: 5.250 s, System: 1.424 s]
  Range (min … max):    6.860 s …  6.905 s    10 runs

after:

Benchmark 1: nix eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'
  Time (mean ± σ):      6.868 s ±  0.027 s    [User: 5.194 s, System: 1.466 s]
  Range (min … max):    6.828 s …  6.913 s    10 runs
This commit is contained in:
pennae 2023-12-27 04:26:50 +01:00
parent 02c64abf1e
commit c62686a95b

View file

@ -235,10 +235,10 @@ static void validatePath(std::string_view s) {
throw FormatError("bad path '%1%' in derivation", s); throw FormatError("bad path '%1%' in derivation", s);
} }
static Path parsePath(StringViewStream & str) static BackedStringView parsePath(StringViewStream & str)
{ {
auto s = parseString(str).toOwned(); auto s = parseString(str);
validatePath(s); validatePath(*s);
return s; return s;
} }
@ -262,7 +262,7 @@ static StringSet parseStrings(StringViewStream & str, bool arePaths)
StringSet res; StringSet res;
expect(str, "["); expect(str, "[");
while (!endOfList(str)) while (!endOfList(str))
res.insert(arePaths ? parsePath(str) : parseString(str).toOwned()); res.insert((arePaths ? parsePath(str) : parseString(str)).toOwned());
return res; return res;
} }
@ -434,9 +434,9 @@ Derivation parseDerivation(
expect(str, ",["); expect(str, ",[");
while (!endOfList(str)) { while (!endOfList(str)) {
expect(str, "("); expect(str, "(");
Path drvPath = parsePath(str); auto drvPath = parsePath(str);
expect(str, ","); expect(str, ",");
drv.inputDrvs.map.insert_or_assign(store.parseStorePath(drvPath), parseDerivedPathMapNode(store, str, version)); drv.inputDrvs.map.insert_or_assign(store.parseStorePath(*drvPath), parseDerivedPathMapNode(store, str, version));
expect(str, ")"); expect(str, ")");
} }
@ -455,7 +455,7 @@ Derivation parseDerivation(
expect(str, "("); auto name = parseString(str).toOwned(); expect(str, "("); auto name = parseString(str).toOwned();
expect(str, ","); auto value = parseString(str).toOwned(); expect(str, ","); auto value = parseString(str).toOwned();
expect(str, ")"); expect(str, ")");
drv.env[name] = value; drv.env.insert_or_assign(std::move(name), std::move(value));
} }
expect(str, ")"); expect(str, ")");