diff --git a/nbproject/project.properties b/nbproject/project.properties index 75dc961..1fdb04e 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -50,7 +50,8 @@ javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir}:\ ${libs.junit_4.classpath}:\ - ${libs.hamcrest.classpath} + ${libs.hamcrest.classpath}:\ + ${libs.JMH_1.12.classpath} javac.test.processorpath=\ ${javac.test.classpath} javadoc.additionalparam= diff --git a/test/com/annimon/ownlang/parser/LexerBenchmarkTest.java b/test/com/annimon/ownlang/parser/LexerBenchmarkTest.java new file mode 100644 index 0000000..934b0fa --- /dev/null +++ b/test/com/annimon/ownlang/parser/LexerBenchmarkTest.java @@ -0,0 +1,48 @@ +package com.annimon.ownlang.parser; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import org.junit.Ignore; +import org.junit.Test; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@State(Scope.Benchmark) +@Ignore +public class LexerBenchmarkTest { + + @Param({"1000"}) + private int iterations; + + private String input; + + @Setup(Level.Trial) + public void initializeTrial() throws IOException { + input = SourceLoader.readSource("program.own"); + } + + @Benchmark + public void lexerBenchmark() { + for (int i = 0; i < iterations; i++) { + Lexer.tokenize(input); + } + } + + @Test + public void executeBenchmark() throws RunnerException { + Options opt = new OptionsBuilder() + .include(LexerBenchmarkTest.class.getSimpleName()) + .warmupIterations(3) + .measurementIterations(5) + .threads(1) + .forks(1) + .build(); + + new Runner(opt).run(); + } +} diff --git a/test/com/annimon/ownlang/parser/ParserBenchmarkTest.java b/test/com/annimon/ownlang/parser/ParserBenchmarkTest.java new file mode 100644 index 0000000..f359564 --- /dev/null +++ b/test/com/annimon/ownlang/parser/ParserBenchmarkTest.java @@ -0,0 +1,50 @@ +package com.annimon.ownlang.parser; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.TimeUnit; +import org.junit.Ignore; +import org.junit.Test; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@State(Scope.Benchmark) +@Ignore +public class ParserBenchmarkTest { + + @Param({"1000"}) + private int iterations; + + private List input; + + @Setup(Level.Trial) + public void initializeTrial() throws IOException { + input = Lexer.tokenize(SourceLoader.readSource("program.own")); + } + + @Benchmark + public void parserBenchmark(Blackhole bh) { + for (int i = 0; i < iterations; i++) { + bh.consume(Parser.parse(input)); + } + } + + @Test + public void executeBenchmark() throws RunnerException { + Options opt = new OptionsBuilder() + .include(ParserBenchmarkTest.class.getSimpleName()) + .warmupIterations(3) + .measurementIterations(5) + .threads(1) + .forks(1) + .build(); + + new Runner(opt).run(); + } +}