diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a293771..df9461d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -102,6 +102,25 @@ jobs: mode: walltime run: ./gradlew :examples:example-gradle:jmh + walltime-benchmarks-flamegraph: + runs-on: codspeed-macro + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 21 + cache: 'gradle' + - name: Run FibFlamegraphBenchmark + uses: CodSpeedHQ/action@main + env: + CODSPEED_BENCH_GROUP: flamegraph + with: + mode: walltime + run: ./gradlew :examples:example-gradle:jmh + check: runs-on: ubuntu-latest if: always() @@ -111,6 +130,7 @@ jobs: - build-and-run-gradle - build-and-run-maven - walltime-benchmarks + - walltime-benchmarks-flamegraph steps: - uses: re-actors/alls-green@release/v1 with: diff --git a/examples/example-gradle/build.gradle.kts b/examples/example-gradle/build.gradle.kts index 756b5f7..0c02e4b 100644 --- a/examples/example-gradle/build.gradle.kts +++ b/examples/example-gradle/build.gradle.kts @@ -29,9 +29,17 @@ jmh { // me.champeau.jmh joins `includes` with commas into a single positional // regex passed to JMH, so multiple entries collapse to one pattern with // literal commas and match nothing. Use a single alternation instead. - includes.set(listOf( - ".*(SleepBenchmark|BacktrackingBenchmark|FibBenchmark).*", - )) + // + // CODSPEED_BENCH_GROUP=flamegraph selects the macOS-only + // FibFlamegraphBenchmark used to exercise the flamegraph pipeline. + // Default is the regular benchmark set. + // TODO(COD-2715): Run all benches on MacOS + val pattern = if (System.getenv("CODSPEED_BENCH_GROUP") == "flamegraph") { + ".*FibFlamegraphBenchmark.*" + } else { + ".*(SleepBenchmark|BacktrackingBenchmark|FibBenchmark).*" + } + includes.set(listOf(pattern)) } } diff --git a/examples/example-gradle/src/jmh/java/bench/FibFlamegraphBenchmark.java b/examples/example-gradle/src/jmh/java/bench/FibFlamegraphBenchmark.java new file mode 100644 index 0000000..df6d3b8 --- /dev/null +++ b/examples/example-gradle/src/jmh/java/bench/FibFlamegraphBenchmark.java @@ -0,0 +1,27 @@ +package bench; + +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.*; + +/** + * macOS-only benchmark whose recursion shape produces an easily-recognisable flamegraph. Gated to + * macOS via Gradle excludes in {@code build.gradle.kts}. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +public class FibFlamegraphBenchmark { + + @Param({"30"}) + private int n; + + @Benchmark + public long fib() { + return fib(n); + } + + private static long fib(int n) { + if (n <= 1) return n; + return fib(n - 1) + fib(n - 2); + } +}