diff --git a/src/test/java/cc/tweaked/cobalt/benchmark/BenchmarkFull.java b/src/test/java/cc/tweaked/cobalt/benchmark/BenchmarkFull.java index 9e38a422..2b837229 100644 --- a/src/test/java/cc/tweaked/cobalt/benchmark/BenchmarkFull.java +++ b/src/test/java/cc/tweaked/cobalt/benchmark/BenchmarkFull.java @@ -6,6 +6,7 @@ import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; import org.openjdk.jmh.runner.options.TimeValue; +import org.openjdk.jmh.runner.options.WarmupMode; /** * Runs all benchmarks within the {@code cc.tweaked.cobalt.benchmark} package. @@ -17,6 +18,8 @@ private BenchmarkFull() { public static void main(String... args) throws RunnerException { Options opts = new OptionsBuilder() .include("cc.tweaked.cobalt.benchmark.*") + .exclude("cc.tweaked.cobalt.benchmark.WarmupBenchmarks.*") + .includeWarmup("cc.tweaked.cobalt.benchmark.WarmupBenchmarks.*") .warmupIterations(3) .warmupTime(TimeValue.milliseconds(1000)) .measurementIterations(5) diff --git a/src/test/java/cc/tweaked/cobalt/benchmark/WarmupBenchmarks.java b/src/test/java/cc/tweaked/cobalt/benchmark/WarmupBenchmarks.java new file mode 100644 index 00000000..707c9964 --- /dev/null +++ b/src/test/java/cc/tweaked/cobalt/benchmark/WarmupBenchmarks.java @@ -0,0 +1,54 @@ +package cc.tweaked.cobalt.benchmark; + +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Warmup; +import org.squiddev.cobalt.Constants; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Generates a Lua program which attempts to execute all parts of the Lua interpreter, ensuring that our actual + * benchmarks don't overspecialise for a specific case. + */ +@Warmup(time = 2, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 0) +public class WarmupBenchmarks extends LuaBenchmark { + public WarmupBenchmarks() { + super(makeFile(), s -> Constants.NONE); + } + + private static String makeFile() { + var out = new StringBuilder(); + out.append("local x, y, _ = 5.2, '123'\n"); + + // Arithmetic and Lua operations + for (var op : List.of("+", "-", "*", "/", "%", "^", "..")) { + addOperation(out, "x", op, "x"); + addOperation(out, "x", op, "y"); + addOperation(out, "x", op, "0"); + addOperation(out, "0", op, "x"); + } + + // Comparison operations + for (var op : List.of("==", "<", "<=")) { + addOperation(out, "x", op, "x"); + addOperation(out, "x", op, "0"); + addOperation(out, "0", op, "x"); + + addOperation(out, "y", op, "y"); + addOperation(out, "y", op, "''"); + addOperation(out, "''", op, "y"); + } + + // Basic control flow + out.append("for i = 1, 10 do _ = 0 end\n"); + out.append("for k in pairs(_G) do _ = _G[k] end\n"); + + return out.toString(); + } + + private static void addOperation(StringBuilder out, String lhs, String op, String rhs) { + out.append("_ = ").append(lhs).append(" ").append(op).append(" ").append(rhs).append("\n"); + } +}