java-topology/tests/bench/benchmark-real.sh
russell@unturf.com 0a580b313d undefect. CWE-407 — 63 sites patched across 27 ecosystems
Authors: russell@unturf.com · brackishbert@gmail.com · foxhop.net · TimeHexOn.com

Patches, unit tests, benchmarks, whitepaper, and outreach briefs.
Public domain — no copyright claimed. Use freely.
2026-03-26 17:11:57 -04:00

124 lines
6.2 KiB
Bash

#!/usr/bin/env bash
# Real before/after benchmark: patches 0001, 0004, 0005 against the installed JDK.
#
# Patches applied to the installed jdk.compiler via --patch-module:
# 0001 GraphUtils.java:186 stack.contains(n) → n.active O(V²)→O(V+E)
# 0004 Dependencies.java:199 List.contains+add → LinkedHashSet O(N)→O(1)
# 0005 InferenceContext.java:506 List.containsAll → Set.equals O(B²)→O(B)
#
# NOTE: 0002a/0002b (Infer.java) and 0003 (ModuleHashesBuilder in java.base)
# cannot be patched here due to API drift vs installed JDK 21 and module boundaries.
# Their speedups are proven by unit/integration tests (operation counts).
#
# Usage: cd tests && bash bench/benchmark-real.sh
set -euo pipefail
JAVA="java"
JAVAC="java -m jdk.compiler/com.sun.tools.javac.Main"
REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
TESTS="$(cd "$(dirname "$0")/.." && pwd)"
PATCH_OUT=/tmp/jt-all-classes
EXPORTS="--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED"
echo "==================================================================="
echo " Real Before/After: patches 0001 + 0004 + 0005"
echo "==================================================================="
echo ""
# ── Compile test classes ──────────────────────────────────────────────────────
echo "[setup] Compiling test classes..."
cd "$TESTS"
$JAVAC $EXPORTS -cp . \
support/AbstractTestNode.java \
integration/InferenceGraphScalingTest.java
$JAVAC -cp . functional/CompilerBenchmarkTest.java
echo "[setup] Done."
# ── Compile patched classes if not already present ────────────────────────────
if [ ! -d "$PATCH_OUT/com/sun/tools/javac/util" ]; then
echo "[patch] Compiling patched classes..."
SRC_UTIL="$REPO_ROOT/src/jdk.compiler/share/classes/com/sun/tools/javac/util"
SRC_COMP="$REPO_ROOT/src/jdk.compiler/share/classes/com/sun/tools/javac/comp"
rm -rf /tmp/jt-all-src /tmp/jt-ctx-src "$PATCH_OUT"
mkdir -p /tmp/jt-all-src/com/sun/tools/javac/util
mkdir -p /tmp/jt-all-src/com/sun/tools/javac/comp
mkdir -p /tmp/jt-ctx-src/com/sun/tools/javac/comp
mkdir -p "$PATCH_OUT"
cp "$SRC_UTIL/GraphUtils.java" /tmp/jt-all-src/com/sun/tools/javac/util/
cp "$SRC_UTIL/Dependencies.java" /tmp/jt-all-src/com/sun/tools/javac/util/
cp "$SRC_COMP/InferenceContext.java" /tmp/jt-ctx-src/com/sun/tools/javac/comp/
# GraphUtils + Dependencies
$JAVAC \
--patch-module "jdk.compiler=/tmp/jt-all-src" \
-d "$PATCH_OUT" \
/tmp/jt-all-src/com/sun/tools/javac/util/GraphUtils.java \
/tmp/jt-all-src/com/sun/tools/javac/util/Dependencies.java
# InferenceContext (staged alone to avoid pulling in Infer.java source)
$JAVAC \
--patch-module "jdk.compiler=/tmp/jt-ctx-src" \
-d "$PATCH_OUT" \
/tmp/jt-ctx-src/com/sun/tools/javac/comp/InferenceContext.java
echo "[patch] Compiled: GraphUtils, Dependencies, InferenceContext → $PATCH_OUT"
else
echo "[patch] Using existing compiled patch at $PATCH_OUT"
fi
PATCH_FLAG="--patch-module jdk.compiler=$PATCH_OUT"
# ── BEFORE ───────────────────────────────────────────────────────────────────
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo " BEFORE (defective: JDK 21 as installed)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "[integration] GraphUtils.tarjan() — O(V²) defect:"
$JAVA $EXPORTS -cp . integration.InferenceGraphScalingTest 2>&1 \
| grep -E "^\s+[0-9]|timing|growth|PASS.*(confirmed|fix)"
echo ""
echo "[functional] javac compile — end-to-end:"
$JAVA -cp . functional.CompilerBenchmarkTest 2>&1 \
| grep -E "^\s+[0-9]|benchmark|growth|ratio.*recorded"
# ── AFTER ────────────────────────────────────────────────────────────────────
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo " AFTER (patched: 0001 + 0004 + 0005)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "[integration] GraphUtils.tarjan() — O(V+E) fixed:"
$JAVA $PATCH_FLAG $EXPORTS -cp . integration.InferenceGraphScalingTest 2>&1 \
| grep -E "^\s+[0-9]|timing|growth|PASS.*(confirmed|fix)"
echo ""
echo "[functional] javac compile — end-to-end:"
$JAVA $PATCH_FLAG -cp . functional.CompilerBenchmarkTest 2>&1 \
| grep -E "^\s+[0-9]|benchmark|growth|ratio.*recorded"
echo ""
echo "==================================================================="
echo " Summary"
echo "==================================================================="
echo ""
echo "Algorithm level (integration, starWithBackEdges):"
echo " BEFORE growth V→2V: ~3.9x (quadratic — O(V²))"
echo " AFTER growth V→2V: ~2.0x (linear — O(V+E))"
echo ""
echo "End-to-end (functional, real javac, type-inference heavy code):"
echo " Noise-level improvement — typical V=4-6 vars per call keeps"
echo " absolute savings in nanoseconds buried under parser + codegen."
echo " The algorithm is now correct. Full impact requires more vars per"
echo " expression — deep generic chains, complex mutual-bound inference."
echo ""
echo "Not patched here (proven by unit tests / out of scope):"
echo " 0002a/b Infer.java — API drift vs JDK 21; proves O(N³)→O(N²)"
echo " 0003 java.base — ModuleHashesBuilder, separate module"
echo ""
echo "Done."