From 2345b3d4d083e04f14aa9c759f0689f2cfc9b48d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophane=20Hufschmitt?= Date: Wed, 26 Jun 2024 14:43:37 +0200 Subject: [PATCH 1/3] Remove a costly debug statement in the symbolic string contract Because this gets put in the contract context, it is evaluated eagerly (it seems at least). Removing this causes a ~1.6x speedup --- lib/nix-interop/derivation.ncl | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/nix-interop/derivation.ncl b/lib/nix-interop/derivation.ncl index 1b03310b..967f2d3f 100644 --- a/lib/nix-interop/derivation.ncl +++ b/lib/nix-interop/derivation.ncl @@ -167,9 +167,6 @@ in else if predicate.is_string_fragment value then mk_nix_string [std.contract.apply NixStringFragment label value] else - # TODO: it's for debugging, but we should remove the serializing at some - # point. - let label = std.contract.label.append_note (std.serialize 'Json value) label in let { fragments, .. } = std.contract.apply NixSymbolicString label value in mk_nix_string fragments, From 0100a9d5aa1cfc1a761ef1f97b46ef1c6ffd5984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophane=20Hufschmitt?= Date: Wed, 26 Jun 2024 15:25:38 +0200 Subject: [PATCH 2/3] Remove an unneeded contract application in Nix strings Addes nearly an extra 1.2x speedup --- lib/nix-interop/derivation.ncl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/nix-interop/derivation.ncl b/lib/nix-interop/derivation.ncl index 967f2d3f..5ff69787 100644 --- a/lib/nix-interop/derivation.ncl +++ b/lib/nix-interop/derivation.ncl @@ -165,7 +165,7 @@ in # We accept a single string fragment (a plain string, a derivation or a # Nix path). We normalize it by wrapping it as a one-element array else if predicate.is_string_fragment value then - mk_nix_string [std.contract.apply NixStringFragment label value] + mk_nix_string [value] else let { fragments, .. } = std.contract.apply NixSymbolicString label value in mk_nix_string fragments, From bd8890563ef64bbb96baf5cffd727e81d90226b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophane=20Hufschmitt?= Date: Wed, 26 Jun 2024 15:29:05 +0200 Subject: [PATCH 3/3] Flatten the Nix strings on the fly Reduces the size of the generated json by ~300%, and causes a ~1.6x speedup in the Nickel evaluation time --- lib/nix-interop/derivation.ncl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/nix-interop/derivation.ncl b/lib/nix-interop/derivation.ncl index 5ff69787..d9b1717e 100644 --- a/lib/nix-interop/derivation.ncl +++ b/lib/nix-interop/derivation.ncl @@ -168,7 +168,12 @@ in mk_nix_string [value] else let { fragments, .. } = std.contract.apply NixSymbolicString label value in - mk_nix_string fragments, + mk_nix_string + ( + std.array.flat_map + (fun elt => elt.fragments) + fragments + ), NixDerivation | doc m%"