refactor(tvix/eval): use im::Vector for NixList representation

This is a persistent, structurally sharing data structure which is
more efficient in some of our use-cases. I have verified the
efficiency improvement using `hyperfine` repeatedly over expressions
on nixpkgs.

Lists are not the most performance-critical structure in Nix (that
would be attribute sets), but we can already see a small (~5-10%)
improvement.

Note that there are a handful of cases where we still go via `Vec`
that need to be fixed, most notable for `builtins.sort` which can not
currently be implemented directly using `im::Vector` because of a
restrictive type bound.

Change-Id: I237cc50cbd7629a046e5a5e4601fbb40355e551d
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7670
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
Vincent Ambo 2022-12-29 14:44:09 +03:00 committed by tazjin
parent 6ab8320f07
commit 5d73c06b1a
8 changed files with 261 additions and 46 deletions

View file

@ -644,6 +644,25 @@ rec {
};
resolvedDefaultFeatures = [ "default" ];
};
"bitmaps" = rec {
crateName = "bitmaps";
version = "2.1.0";
edition = "2018";
sha256 = "18k4mcwxl96yvii5kcljkpb8pg5j4jj1zbsdn26nsx4r83846403";
authors = [
"Bodil Stokke <bodil@bodil.org>"
];
dependencies = [
{
name = "typenum";
packageId = "typenum";
}
];
features = {
"default" = [ "std" ];
};
resolvedDefaultFeatures = [ "default" "std" ];
};
"blake3" = rec {
crateName = "blake3";
version = "1.3.3";
@ -2353,6 +2372,51 @@ rec {
];
};
"im" = rec {
crateName = "im";
version = "15.1.0";
edition = "2018";
sha256 = "1sg0jy9y0l3lqjpjyclj6kspi027mx177dgrmacgjni8y0zx7b6h";
authors = [
"Bodil Stokke <bodil@bodil.org>"
];
dependencies = [
{
name = "bitmaps";
packageId = "bitmaps";
}
{
name = "rand_core";
packageId = "rand_core 0.6.4";
}
{
name = "rand_xoshiro";
packageId = "rand_xoshiro";
}
{
name = "sized-chunks";
packageId = "sized-chunks";
}
{
name = "typenum";
packageId = "typenum";
}
];
buildDependencies = [
{
name = "version_check";
packageId = "version_check";
}
];
features = {
"arbitrary" = [ "dep:arbitrary" ];
"proptest" = [ "dep:proptest" ];
"quickcheck" = [ "dep:quickcheck" ];
"rayon" = [ "dep:rayon" ];
"refpool" = [ "dep:refpool" ];
"serde" = [ "dep:serde" ];
};
};
"indexmap" = rec {
crateName = "indexmap";
version = "1.9.2";
@ -3933,6 +3997,25 @@ rec {
"serde1" = [ "serde" ];
};
};
"rand_xoshiro" = rec {
crateName = "rand_xoshiro";
version = "0.6.0";
edition = "2018";
sha256 = "1ajsic84rzwz5qr0mzlay8vi17swqi684bqvwqyiim3flfrcv5vg";
authors = [
"The Rand Project Developers"
];
dependencies = [
{
name = "rand_core";
packageId = "rand_core 0.6.4";
}
];
features = {
"serde" = [ "dep:serde" ];
"serde1" = [ "serde" ];
};
};
"rayon" = rec {
crateName = "rayon";
version = "1.6.0";
@ -4568,6 +4651,33 @@ rec {
};
resolvedDefaultFeatures = [ "default" "std" ];
};
"sized-chunks" = rec {
crateName = "sized-chunks";
version = "0.6.5";
edition = "2018";
sha256 = "07ix5fsdnpf2xsb0k5rbiwlmsicm2237fcx7blirp9p7pljr5mhn";
authors = [
"Bodil Stokke <bodil@bodil.org>"
];
dependencies = [
{
name = "bitmaps";
packageId = "bitmaps";
}
{
name = "typenum";
packageId = "typenum";
}
];
features = {
"arbitrary" = [ "dep:arbitrary" ];
"array-ops" = [ "dep:array-ops" ];
"default" = [ "std" ];
"refpool" = [ "dep:refpool" ];
"ringbuffer" = [ "array-ops" ];
};
resolvedDefaultFeatures = [ "default" "std" ];
};
"slab" = rec {
crateName = "slab";
version = "0.4.7";
@ -6013,6 +6123,10 @@ rec {
name = "dirs";
packageId = "dirs";
}
{
name = "im";
packageId = "im";
}
{
name = "path-clean";
packageId = "path-clean";