From 3347699a8ce0c8ba6f767906aaee6fc0a3d145ba Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Mon, 23 Feb 2026 02:24:10 +0300 Subject: [PATCH] tests/benchmark: make benchmark cases... bigger Signed-off-by: NotAShelf Change-Id: Iabd307b475f6568cff4d1ae6e5ae56ef6a6a6964 --- tests/benchmark/large.nix | 218 ++++++++++++++++++++++++++++++++++--- tests/benchmark/medium.nix | 74 ++++++++++--- tests/benchmark/run.sh | 5 +- 3 files changed, 267 insertions(+), 30 deletions(-) diff --git a/tests/benchmark/large.nix b/tests/benchmark/large.nix index ffd7e22..bf29a77 100644 --- a/tests/benchmark/large.nix +++ b/tests/benchmark/large.nix @@ -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; } diff --git a/tests/benchmark/medium.nix b/tests/benchmark/medium.nix index f8db9e9..6234dca 100644 --- a/tests/benchmark/medium.nix +++ b/tests/benchmark/medium.nix @@ -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; } diff --git a/tests/benchmark/run.sh b/tests/benchmark/run.sh index 8e43fe8..c392139 100755 --- a/tests/benchmark/run.sh +++ b/tests/benchmark/run.sh @@ -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)"