nix-gh/src/libexpr
Eelco Dolstra 0395b9b94a
Add memoise primop
'builtins.memoise f x' is equal to 'f x', but uses a cache to speed up
repeated invocations of 'f' with the same 'x'. A typical application
is memoising evaluations of Nixpkgs in NixOps network
specifications. For example, with the patch below, the time to
evaluate a 10-machine NixOps network is reduced from 17.1s to 9.6s,
while memory consumption goes from 4486 MiB to 3089 MiB. (This is with
GC_INITIAL_HEAP_SIZE=16G.)

Nixpkgs patch:

diff --git a/pkgs/top-level/impure.nix b/pkgs/top-level/impure.nix
index a9f21e45aed..f641067e022 100644
--- a/pkgs/top-level/impure.nix
+++ b/pkgs/top-level/impure.nix
@@ -79,7 +79,7 @@ in
 # not be passed.
 assert args ? localSystem -> !(args ? system || args ? platform);

-import ./. (builtins.removeAttrs args [ "system" "platform" ] // {
+builtins.memoise or (x: x) (import ./.) (builtins.removeAttrs args [ "system" "platform" ] // {
   inherit config overlays crossSystem;
   # Fallback: Assume we are building packages on the current (build, in GNU
   # Autotools parlance) system.
2018-01-11 19:24:22 +01:00
..
primops Add memoise primop 2018-01-11 19:24:22 +01:00
attr-path.cc Replace Unicode quotes in user-facing strings by ASCII 2017-07-30 12:32:45 +01:00
attr-path.hh Work on Values instead of Exprs 2013-09-03 13:17:51 +00:00
attr-set.cc Optimize empty sets 2015-07-23 23:11:08 +02:00
attr-set.hh Bindings: Add a method for iterating in lexicographically sorted order 2017-01-26 20:40:33 +01:00
common-eval-args.cc nix: Respect -I, --arg, --argstr 2017-10-24 12:58:34 +02:00
common-eval-args.hh Fix build 2017-11-01 21:32:30 +01:00
eval-inline.hh Restore thunks on any exception 2017-06-20 12:13:17 +02:00
eval.cc Add memoise primop 2018-01-11 19:24:22 +01:00
eval.hh Add memoise primop 2018-01-11 19:24:22 +01:00
get-drvs.cc nix-shell/nix-build: Support .drv files again 2017-11-24 18:08:35 +01:00
get-drvs.hh nix-shell/nix-build: Support .drv files again 2017-11-24 18:08:35 +01:00
json-to-value.cc json-to-value: Throw sensible error message on invalid numbers 2017-12-14 19:09:45 -05:00
json-to-value.hh Add builtin function ‘fromJSON’ 2014-07-04 13:34:15 +02:00
lexer.l Revert "Don't parse "x:x" as a URI" 2017-11-14 15:10:52 +01:00
local.mk Shut up some warnings 2017-04-14 14:42:20 +02:00
names.cc replace own regex class with std::regex 2016-10-18 20:22:25 +02:00
names.hh replace own regex class with std::regex 2016-10-18 20:22:25 +02:00
nix-expr.pc.in Install some pkgconfig files 2014-09-18 12:00:40 +02:00
nixexpr.cc Replace Unicode quotes in user-facing strings by ASCII 2017-07-30 12:32:45 +01:00
nixexpr.hh Replace Unicode quotes in user-facing strings by ASCII 2017-07-30 12:32:45 +01:00
parser.y Remove git:// support in NIX_PATH 2017-11-03 13:55:31 +01:00
primops.cc Add hasContext primop 2018-01-02 12:25:14 -05:00
primops.hh Make primop registration pluggable 2016-04-14 12:50:01 +02:00
symbol-table.hh Include config.h implicitly with '-include config.h' in CFLAGS 2017-02-08 21:51:02 +02:00
value-to-json.cc nix path-info: Add --json flag 2016-08-29 17:29:24 +02:00
value-to-json.hh nix path-info: Add --json flag 2016-08-29 17:29:24 +02:00
value-to-xml.cc First hit at providing support for floats in the language. 2016-01-05 00:40:40 +01:00
value-to-xml.hh Use "#pragma once" to prevent repeated header file inclusion 2012-07-18 14:59:03 -04:00
value.hh Restructure installables handling in the "nix" command 2017-04-25 11:20:37 +02:00