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.
124 lines
6.2 KiB
Bash
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."
|