diff --git a/.github/workflows/jmeter-benchmarking.yaml b/.github/workflows/jmeter-benchmarking.yaml index bede762c2d..a07004f2f0 100644 --- a/.github/workflows/jmeter-benchmarking.yaml +++ b/.github/workflows/jmeter-benchmarking.yaml @@ -1,44 +1,69 @@ -name: Minimal setup +name: JMH Benchmark on: push: branches: - main + pull_request: + branches: + - main + +permissions: + contents: write + deployments: write jobs: benchmark: + name: Run JMH benchmark example runs-on: ubuntu-latest steps: - - name: Continuous Benchmark - uses: benchmark-action/github-action-benchmark@v1.18.0 + - uses: actions/checkout@v3 + - uses: actions/setup-java@v2 + with: + distribution: 'adopt' + java-version: '11' + - name: Cache SBT dependencies + uses: coursier/cache-action@v6 + - name: Build and run JMH benchmark + run: | + sbt clean compile + sbt 'benchmarks/jmh:run -i 1 -wi 0 -f1 -t1 -rf json -rff output.json .*' + - name: JMH Benchmark Action + uses: kitlangton/jmh-benchmark-action@main + with: + jmh-output-path: benchmarks/output.json + github-token: ${{ secrets.GITHUB_TOKEN }} + + # - name: Run benchmark + # run: | + # mvn clean install + # java -jar target/benchmarks.jar -wi 1 -i 3 -f 1 -rf json + # - name: Store benchmark result + # uses: benchmark-action/github-action-benchmark@v1 + # with: + # name: JMH Benchmark + # tool: 'jmh' + # output-file-path: examples/java/jmh-result.json + # # Use personal access token instead of GITHUB_TOKEN due to https://github.community/t/github-action-not-triggering-gh-pages-upon-push/16096 + # github-token: ${{ secrets.GITHUB_TOKEN }} + # auto-push: true + # # Show alert with commit comment on detecting possible performance regression + # alert-threshold: '200%' + # comment-on-alert: true + # fail-on-alert: true + # # alert-comment-cc-users: '@michaelmior' -# jobs: -# benchmark: -# name: Performance regression check -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v2 -# - uses: actions/setup-go@v4 -# with: -# go-version: "stable" -# # Run benchmark with `go test -bench` and stores the output to a file -# - name: Run benchmark -# run: go mod init && go test -bench 'BenchmarkFib' | tee output.txt -# # Download previous benchmark result from cache (if exists) -# - name: Download previous benchmark data -# uses: actions/cache@v1 -# with: -# path: ./cache -# key: ${{ runner.os }}-benchmark -# # Run `github-action-benchmark` action -# - name: Store benchmark result -# uses: benchmark-action/github-action-benchmark@v1 -# with: -# # What benchmark tool the output.txt came from -# tool: 'go' -# # Where the output from the benchmark tool is stored -# output-file-path: output.txt -# # Where the previous data file is stored -# external-data-json-path: ./cache/benchmark-data.json -# # Workflow will fail when an alert happens -# fail-on-alert: true -# # Upload the updated cache file for the next job by actions/cache + # - name: Store benchmark result - separate results repo + # uses: benchmark-action/github-action-benchmark@v1 + # with: + # name: JMH Benchmark + # tool: 'jmh' + # output-file-path: examples/java/jmh-result.json + # # Use personal access token instead of GITHUB_TOKEN due to https://github.community/t/github-action-not-triggering-gh-pages-upon-push/16096 + # github-token: ${{ secrets.BENCHMARK_ACTION_BOT_TOKEN }} + # auto-push: true + # # Show alert with commit comment on detecting possible performance regression + # alert-threshold: '200%' + # comment-on-alert: true + # fail-on-alert: true + # # alert-comment-cc-users: '@michaelmior' + # gh-repository: 'github.com/benchmark-action/github-action-benchmark-results' \ No newline at end of file diff --git a/.scalafmt.conf b/.scalafmt.conf new file mode 100644 index 0000000000..4f3ba64cd4 --- /dev/null +++ b/.scalafmt.conf @@ -0,0 +1,9 @@ +version = 3.7.2 + +maxColumn = 120 +align.preset = most +align.multiline = false +docstrings.wrapMaxColumn = 80 +runner.dialect = scala213 + +rewrite.rules = [RedundantBraces, RedundantParens] \ No newline at end of file diff --git a/benchmarks/src/main/scala/benchmarks/Benchmarks.scala b/benchmarks/src/main/scala/benchmarks/Benchmarks.scala new file mode 100644 index 0000000000..99cdee15f9 --- /dev/null +++ b/benchmarks/src/main/scala/benchmarks/Benchmarks.scala @@ -0,0 +1,20 @@ +package benchmarks + +import org.openjdk.jmh.annotations._ + +@State(Scope.Benchmark) +class MyBenchmark { + + @Benchmark + def measure(): Unit = { + val x = 1 + 1 + val slow = List.fill(7_000)(x).reverse + } + + @Benchmark + def measure2(): Unit = { + val x = 1 + 2 + val slow = List.fill(53_100)(x).reverse + } + +} \ No newline at end of file diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000000..1dc979b092 --- /dev/null +++ b/build.sbt @@ -0,0 +1,44 @@ +ThisBuild / version := "0.1.0-SNAPSHOT" +ThisBuild / scalaVersion := "2.13.11" + +lazy val root = project + .in(file(".")) + .aggregate(core, benchmarks) + .settings( + name := "jmh-benchmark-action", + publish / skip := true + ) + +lazy val core = (project in file("core")) + .settings( + name := "jmh-benchmark-action", + scalacOptions ++= Seq("-deprecation", "-feature"), + resolvers ++= Resolver.sonatypeOssRepos("snapshots"), + libraryDependencies ++= Seq( + "dev.zio" %% "zio" % "2.0.15", + "dev.zio" %% "zio-test" % "2.0.15" % Test, + "dev.zio" %% "zio-test-sbt" % "2.0.15" % Test, + "dev.zio" %% "zio-json" % "0.6.0", + "dev.zio" %% "zio-json-yaml" % "0.6.0", + "dev.zio" %% "zio-http" % "3.0.0-RC2+41-1b09b785-SNAPSHOT" + ), + testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework") + ) + +val runBenchmarks = TaskKey[Unit]("runBenchmarks") + +lazy val benchmarks = (project in file("benchmarks")) + .enablePlugins(JmhPlugin) + .settings( + name := "jmh-benchmark-action", + scalacOptions ++= Seq("-deprecation", "-feature"), + resolvers ++= Resolver.sonatypeOssRepos("snapshots"), + testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework"), + runBenchmarks := { +// (Jmh / run).toTask(" -i 3 -wi 3 -f1 -t1 -rf json -rff output.json .*").value + (Jmh / run).toTask(" -i 1 -wi 0 -f1 -t1 -rf json -rff output.json .*").value + } + ) + .dependsOn(core) + +Global / onChangedBuildSource := ReloadOnSourceChanges \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000..7fc4d34070 --- /dev/null +++ b/pom.xml @@ -0,0 +1,172 @@ + + + + 4.0.0 + + org.openjdk.jmh.samples + jmh-sample + 1.0 + jar + + JMH benchmark sample: Java + + + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + provided + + + + + UTF-8 + + + 1.36 + + + 1.8 + + + benchmarks + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${javac.target} + ${javac.target} + ${javac.target} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.1 + + + package + + shade + + + ${uberjar.name} + + + org.openjdk.jmh.Main + + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + + + + + maven-clean-plugin + 2.5 + + + maven-deploy-plugin + 2.8.1 + + + maven-install-plugin + 2.5.1 + + + maven-jar-plugin + 2.4 + + + maven-javadoc-plugin + 2.9.1 + + + maven-resources-plugin + 2.6 + + + maven-site-plugin + 3.3 + + + maven-source-plugin + 2.2.1 + + + maven-surefire-plugin + 2.17 + + + + + + \ No newline at end of file diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 0000000000..646f724ca6 --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version = 1.9.3 \ No newline at end of file diff --git a/project/plugins.sbt b/project/plugins.sbt new file mode 100644 index 0000000000..8c0865fba8 --- /dev/null +++ b/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.5") \ No newline at end of file