tests/benchmark: make benchmark cases... bigger
Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: Iabd307b475f6568cff4d1ae6e5ae56ef6a6a6964
This commit is contained in:
parent
84cf5fdf68
commit
3347699a8c
3 changed files with 267 additions and 30 deletions
|
|
@ -1,15 +1,50 @@
|
|||
# Large :b:oke ---I mean...benchmark, for stress testing
|
||||
# Large benchmark for comprehensive stress testing
|
||||
let
|
||||
# Generate large list
|
||||
range = start: end:
|
||||
if start >= end
|
||||
then []
|
||||
else [start] ++ range (start + 1) end;
|
||||
|
||||
# Deep nesting
|
||||
deepNest = {a = {b = {c = {d = {e = {f = 42;};};};};};};
|
||||
concat = a: b: a ++ b;
|
||||
|
||||
factorial = n:
|
||||
if n <= 1
|
||||
then 1
|
||||
else n * factorial (n - 1);
|
||||
|
||||
# Ackermann function (highly recursive)
|
||||
ackermann = m: n:
|
||||
if m == 0
|
||||
then n + 1
|
||||
else if n == 0
|
||||
then ackermann (m - 1) 1
|
||||
else ackermann (m - 1) (ackermann m (n - 1));
|
||||
|
||||
# Greatest common divisor
|
||||
gcd = a: b:
|
||||
if b == 0
|
||||
then a
|
||||
else gcd b (a - (a / b) * b);
|
||||
|
||||
# Power function
|
||||
pow = base: exp:
|
||||
if exp == 0
|
||||
then 1
|
||||
else if exp == 1
|
||||
then base
|
||||
else base * pow base (exp - 1);
|
||||
|
||||
compose = f: g: x: f (g x);
|
||||
double = x: x * 2;
|
||||
addTen = x: x + 10;
|
||||
square = x: x * x;
|
||||
|
||||
pipeline = compose square (compose double addTen);
|
||||
|
||||
list_100 = range 1 101;
|
||||
list_50 = range 1 51;
|
||||
list_25 = range 1 26;
|
||||
|
||||
# Large attrset
|
||||
largeAttrs = {
|
||||
a1 = 1;
|
||||
a2 = 2;
|
||||
|
|
@ -31,17 +66,172 @@ let
|
|||
b8 = 18;
|
||||
b9 = 19;
|
||||
b10 = 20;
|
||||
c1 = 21;
|
||||
c2 = 22;
|
||||
c3 = 23;
|
||||
c4 = 24;
|
||||
c5 = 25;
|
||||
c6 = 26;
|
||||
c7 = 27;
|
||||
c8 = 28;
|
||||
c9 = 29;
|
||||
c10 = 30;
|
||||
d1 = 31;
|
||||
d2 = 32;
|
||||
d3 = 33;
|
||||
d4 = 34;
|
||||
d5 = 35;
|
||||
d6 = 36;
|
||||
d7 = 37;
|
||||
d8 = 38;
|
||||
d9 = 39;
|
||||
d10 = 40;
|
||||
e1 = 41;
|
||||
e2 = 42;
|
||||
e3 = 43;
|
||||
e4 = 44;
|
||||
e5 = 45;
|
||||
e6 = 46;
|
||||
e7 = 47;
|
||||
e8 = 48;
|
||||
e9 = 49;
|
||||
e10 = 50;
|
||||
};
|
||||
|
||||
# Recursive attrset
|
||||
recursive = rec {
|
||||
x = 10;
|
||||
y = x * 2;
|
||||
z = y + x;
|
||||
result = z * 3;
|
||||
# Very deep nesting (10 levels)
|
||||
deepNest = {
|
||||
level1 = {
|
||||
level2 = {
|
||||
level3 = {
|
||||
level4 = {
|
||||
level5 = {
|
||||
level6 = {
|
||||
level7 = {
|
||||
level8 = {
|
||||
level9 = {
|
||||
level10 = {
|
||||
treasure = "found";
|
||||
value = 12345;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
recursiveComplex = rec {
|
||||
base = 10;
|
||||
doubled = base * 2;
|
||||
tripled = base * 3;
|
||||
|
||||
sum = doubled + tripled;
|
||||
product = doubled * tripled;
|
||||
|
||||
x = base * 4;
|
||||
y = x + doubled;
|
||||
z = y * tripled;
|
||||
|
||||
total = sum + product + z;
|
||||
final = total * base;
|
||||
};
|
||||
|
||||
config1 = rec {
|
||||
multiplier = 5;
|
||||
base = 100;
|
||||
result = base * multiplier;
|
||||
};
|
||||
|
||||
config2 = rec {
|
||||
offset = 50;
|
||||
scaled = config1.result + offset;
|
||||
doubled = scaled * 2;
|
||||
};
|
||||
|
||||
config3 = rec {
|
||||
factor = 3;
|
||||
combined = config2.doubled * factor;
|
||||
final = combined + config1.multiplier;
|
||||
};
|
||||
|
||||
baseConfig = {
|
||||
system = {
|
||||
arch = "x86_64";
|
||||
os = "linux";
|
||||
};
|
||||
settings = {
|
||||
enabled = true;
|
||||
level = 5;
|
||||
};
|
||||
};
|
||||
|
||||
overrides = {
|
||||
system = {
|
||||
kernel = "6.1";
|
||||
};
|
||||
settings = {
|
||||
level = 10;
|
||||
extra = "custom";
|
||||
};
|
||||
newSection = {
|
||||
value = 42;
|
||||
};
|
||||
};
|
||||
|
||||
merged =
|
||||
baseConfig
|
||||
// overrides
|
||||
// {
|
||||
system = baseConfig.system // overrides.system;
|
||||
settings =
|
||||
baseConfig.settings
|
||||
// overrides.settings
|
||||
// {
|
||||
combined = baseConfig.settings.level + overrides.settings.level;
|
||||
};
|
||||
};
|
||||
|
||||
fact10 = factorial 10;
|
||||
fact7 = factorial 7;
|
||||
ack_3_3 = ackermann 3 3;
|
||||
gcd_48_18 = gcd 48 18;
|
||||
gcd_100_35 = gcd 100 35;
|
||||
pow_2_10 = pow 2 10;
|
||||
pow_3_5 = pow 3 5;
|
||||
|
||||
pipelineResult = pipeline 5; # ((5 + 10) * 2)^2 = 900
|
||||
|
||||
# List operations
|
||||
concatenated = concat [1 2 3] [4 5 6];
|
||||
multilevel = concat (concat [1] [2 3]) [4 5];
|
||||
in {
|
||||
list_100 = range 1 100;
|
||||
deep = deepNest.a.b.c.d.e.f;
|
||||
inherit largeAttrs recursive;
|
||||
# Lists
|
||||
inherit list_100 list_50 list_25 concatenated multilevel;
|
||||
|
||||
# Math results
|
||||
inherit fact10 fact7 ack_3_3 gcd_48_18 gcd_100_35 pow_2_10 pow_3_5 pipelineResult;
|
||||
|
||||
# Data structures
|
||||
inherit largeAttrs merged;
|
||||
deepValue = deepNest.level1.level2.level3.level4.level5.level6.level7.level8.level9.level10.value;
|
||||
deepTreasure = deepNest.level1.level2.level3.level4.level5.level6.level7.level8.level9.level10.treasure;
|
||||
|
||||
# Recursive attrsets
|
||||
recursiveTotal = recursiveComplex.total;
|
||||
recursiveFinal = recursiveComplex.final;
|
||||
computedZ = recursiveComplex.z;
|
||||
|
||||
# Config chain
|
||||
config1Result = config1.result;
|
||||
config2Doubled = config2.doubled;
|
||||
config3Final = config3.final;
|
||||
|
||||
# Merged config
|
||||
mergedCombined = merged.settings.combined;
|
||||
mergedArch = merged.system.arch;
|
||||
mergedKernel = merged.system.kernel;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,31 +1,75 @@
|
|||
let
|
||||
# Recursive fibonacci (not memoized)
|
||||
# Recursive factorial
|
||||
factorial = n:
|
||||
if n <= 1
|
||||
then 1
|
||||
else n * factorial (n - 1);
|
||||
|
||||
# Fibonacci sequence generator
|
||||
fib = n:
|
||||
if n <= 1
|
||||
then n
|
||||
else fib (n - 1) + fib (n - 2);
|
||||
|
||||
# List operations
|
||||
numbers = [1 2 3 4 5 6 7 8 9 10];
|
||||
doubled = builtins.map (x: x * 2) numbers;
|
||||
# List concatenation test
|
||||
range = start: end:
|
||||
if start >= end
|
||||
then []
|
||||
else [start] ++ range (start + 1) end;
|
||||
|
||||
# Attrset operations
|
||||
# Curried function application
|
||||
add = x: y: x + y;
|
||||
add5 = add 5;
|
||||
|
||||
# Complex computation
|
||||
compute = x: y: let
|
||||
a = x * 2;
|
||||
b = y + 10;
|
||||
c = a * b;
|
||||
in
|
||||
c / 2;
|
||||
|
||||
# Data structures
|
||||
numbers = range 1 11;
|
||||
|
||||
# Nested attribute operations
|
||||
base = {
|
||||
a = 1;
|
||||
b = 2;
|
||||
c = 3;
|
||||
config = {
|
||||
enable = true;
|
||||
value = 42;
|
||||
};
|
||||
data = {
|
||||
items = [1 2 3];
|
||||
};
|
||||
};
|
||||
|
||||
extended =
|
||||
base
|
||||
// {
|
||||
d = 4;
|
||||
e = 5;
|
||||
config =
|
||||
base.config
|
||||
// {
|
||||
extra = "test";
|
||||
multiplied = base.config.value * 2;
|
||||
};
|
||||
computed = base.config.value + 100;
|
||||
};
|
||||
|
||||
# String operations
|
||||
greeting = "Hello";
|
||||
message = "${greeting}, World!";
|
||||
# Recursive attrset with selections
|
||||
recursive = rec {
|
||||
x = 10;
|
||||
y = x * 2;
|
||||
z = y + x;
|
||||
result = z * 3;
|
||||
final = result + x;
|
||||
};
|
||||
in {
|
||||
fibonacci_10 = fib 10;
|
||||
inherit doubled extended message;
|
||||
fact5 = factorial 5;
|
||||
fib7 = fib 7;
|
||||
sum15 = add5 10;
|
||||
computed = compute 10 20;
|
||||
inherit numbers extended;
|
||||
deepValue = extended.config.multiplied;
|
||||
recursiveResult = recursive.result;
|
||||
recursiveFinal = recursive.final;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,7 +83,10 @@ run_benchmark() {
|
|||
src_size=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null)
|
||||
local ir_size
|
||||
ir_size=$(stat -c%s /tmp/bench.nixir 2>/dev/null || stat -f%z /tmp/bench.nixir 2>/dev/null)
|
||||
local ratio=$((ir_size * 100 / src_size))
|
||||
local ratio=0
|
||||
if [[ "$src_size" -gt 0 ]]; then
|
||||
ratio=$((ir_size * 100 / src_size))
|
||||
fi
|
||||
echo -e " Source size: ${src_size}B"
|
||||
echo -e " IR bundle size: ${ir_size}B (${ratio}% of source)"
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue