[Nix-dev] [Nix-commits] [NixOS/nix] 4ccd48: Add a "filter" primop
Sander van der Burg - EWI
S.vanderBurg at tudelft.nl
Mon Aug 13 12:40:45 CEST 2012
Well, I believe the Nix expression language is Turing complete right (although I have no proof), so it is as powerful as any other general purpose language.
Haha!
Just kidding....
________________________________________
From: nix-dev-bounces at lists.science.uu.nl [nix-dev-bounces at lists.science.uu.nl] on behalf of Shea Levy [shea at shealevy.com]
Sent: Monday, August 13, 2012 12:34 PM
To: nix-dev at lists.science.uu.nl; Eelco Dolstra
Cc: nix-commits at lists.science.uu.nl
Subject: Re: [Nix-dev] [Nix-commits] [NixOS/nix] 4ccd48: Add a "filter" primop
If you're not careful, nix may soon be a general purpose language ;)
In seriousness, hooray for optimization!
On Aug 13, 2012, at 2:11 AM, Eelco Dolstra <eelco.dolstra at logicblox.com> wrote:
> Branch: refs/heads/master
> Home: https://github.com/NixOS/nix
> Commit: 4ccd48ce2478cbe1263605838969f89d5b745f0a
> https://github.com/NixOS/nix/commit/4ccd48ce2478cbe1263605838969f89d5b745f0a
> Author: Eelco Dolstra <eelco.dolstra at logicblox.com>
> Date: 2012-08-12 (Sun, 12 Aug 2012)
>
> Changed paths:
> M src/libexpr/eval.cc
> M src/libexpr/primops.cc
>
> Log Message:
> -----------
> Add a "filter" primop
>
> Evaluation of a NixOS configuration spends quite a lot of time in the
> "filter" function in Nixpkgs. As implemented in Nixpkgs, this is a
> O(n^2) operation, so it's a good candidate for providing a more
> efficient (i.e. primop) implementation. Using it gives a ~10% speed
> increase and a significant reduction in the number of evaluations.
>
> Statistics before (on a NixOS system config):
>
> time elapsed: 1.3258
> size of a value: 24
> environments allocated: 1980939 (50127080 bytes)
> list elements: 14679308 (117434464 bytes)
> list concatenations: 50828
> values allocated: 2098938 (50374512 bytes)
> attribute sets allocated: 392040
> right-biased unions: 186334
> values copied in right-biased unions: 591137
> symbols in symbol table: 18271
> number of thunks: 1645752
> number of thunks avoided: 1921196
> number of attr lookups: 430798
> number of primop calls: 838807
> number of function calls: 1930107
>
> Statistics after:
>
> time elapsed: 1.17982
> size of a value: 24
> environments allocated: 1543334 (39624560 bytes)
> list elements: 9612638 (76901104 bytes)
> list concatenations: 37434
> values allocated: 1854933 (44518392 bytes)
> attribute sets allocated: 392040
> right-biased unions: 186334
> values copied in right-biased unions: 591137
> symbols in symbol table: 18272
> number of thunks: 1392467
> number of thunks avoided: 1507311
> number of attr lookups: 430801
> number of primop calls: 691600
> number of function calls: 1492502
>
>
> Commit: b9e5b908ed29bfb6cd82837f9f57293c1f63e999
> https://github.com/NixOS/nix/commit/b9e5b908ed29bfb6cd82837f9f57293c1f63e999
> Author: Eelco Dolstra <eelco.dolstra at logicblox.com>
> Date: 2012-08-12 (Sun, 12 Aug 2012)
>
> Changed paths:
> M src/libexpr/primops.cc
>
> Log Message:
> -----------
> Provide an efficient implementation of ‘elem’
>
> The one in Nixpkgs is O(n^2), this one is O(n). Big reduction in the
> number of list allocations.
>
> Statistics before (on a NixOS system config):
>
> time elapsed: 1.17982
> size of a value: 24
> environments allocated: 1543334 (39624560 bytes)
> list elements: 9612638 (76901104 bytes)
> list concatenations: 37434
> values allocated: 1854933 (44518392 bytes)
> attribute sets allocated: 392040
> right-biased unions: 186334
> values copied in right-biased unions: 591137
> symbols in symbol table: 18272
> number of thunks: 1392467
> number of thunks avoided: 1507311
> number of attr lookups: 430801
> number of primop calls: 691600
> number of function calls: 1492502
>
> Statistics after:
>
> time elapsed: 1.08683
> size of a value: 24
> environments allocated: 1384376 (35809568 bytes)
> list elements: 6946783 (55574264 bytes)
> list concatenations: 37434
> values allocated: 1760440 (42250560 bytes)
> attribute sets allocated: 392040
> right-biased unions: 186334
> values copied in right-biased unions: 591137
> symbols in symbol table: 18273
> number of thunks: 1297673
> number of thunks avoided: 1380759
> number of attr lookups: 430802
> number of primop calls: 628912
> number of function calls: 1333544
>
>
> Commit: 198d0338be7c105b6dbd707f98e0c223a8358240
> https://github.com/NixOS/nix/commit/198d0338be7c105b6dbd707f98e0c223a8358240
> Author: Eelco Dolstra <eelco.dolstra at logicblox.com>
> Date: 2012-08-12 (Sun, 12 Aug 2012)
>
> Changed paths:
> M src/libexpr/eval.cc
> M src/libexpr/eval.hh
> M src/libexpr/primops.cc
>
> Log Message:
> -----------
> Add a primop ‘concatLists’
>
> This can serve as a generic efficient list builder. For instance, the
> function ‘catAttrs’ in Nixpkgs can be rewritten from
>
> attr: l: fold (s: l: if hasAttr attr s then [(getAttr attr s)] ++ l else l) [] l
>
> to
>
> attr: l: builtins.concatLists (map (s: if hasAttr attr s then [(getAttr attr s)] else []) l)
>
> Statistics before:
>
> time elapsed: 1.08683
> size of a value: 24
> environments allocated: 1384376 (35809568 bytes)
> list elements: 6946783 (55574264 bytes)
> list concatenations: 37434
> values allocated: 1760440 (42250560 bytes)
> attribute sets allocated: 392040
> right-biased unions: 186334
> values copied in right-biased unions: 591137
> symbols in symbol table: 18273
> number of thunks: 1297673
> number of thunks avoided: 1380759
> number of attr lookups: 430802
> number of primop calls: 628912
> number of function calls: 1333544
>
> Statistics after (including new catAttrs):
>
> time elapsed: 0.959854
> size of a value: 24
> environments allocated: 1010198 (26829296 bytes)
> list elements: 1984878 (15879024 bytes)
> list concatenations: 30488
> values allocated: 1589760 (38154240 bytes)
> attribute sets allocated: 392040
> right-biased unions: 186334
> values copied in right-biased unions: 591137
> symbols in symbol table: 18274
> number of thunks: 1040925
> number of thunks avoided: 1038428
> number of attr lookups: 438419
> number of primop calls: 474844
> number of function calls: 959366
>
>
> Compare: https://github.com/NixOS/nix/compare/62f72eb9e1a4...198d0338be7c
> _______________________________________________
> nix-commits mailing list
> nix-commits at lists.science.uu.nl
> http://lists.science.uu.nl/mailman/listinfo/nix-commits
_______________________________________________
nix-dev mailing list
nix-dev at lists.science.uu.nl
http://lists.science.uu.nl/mailman/listinfo/nix-dev
More information about the nix-dev
mailing list