From 9961e774c8080de474bfc33e29cb9d20905eb528 Mon Sep 17 00:00:00 2001 From: Benjamin Benoist Date: Wed, 14 Oct 2020 15:45:47 +0200 Subject: [PATCH] Add benchmarking module (close #108) --- README.md | 10 ++++++ benchmark/build.sbt | 6 ++++ .../benchmark/BenchmarkAnalyticsSDK.scala | 35 +++++++++++++++++++ build.sbt | 5 +++ project/plugins.sbt | 1 + 5 files changed, 57 insertions(+) create mode 100644 benchmark/build.sbt create mode 100644 benchmark/src/test/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/benchmark/BenchmarkAnalyticsSDK.scala diff --git a/README.md b/README.md index e59ab45..b81ad61 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,16 @@ Use this SDK with **[Apache Spark][spark]**, **[AWS Lambda][lambda]**, **[Apache [Setup guide][setup-guide] and [User guide][user-guide] are available on the [Snowplow wiki][snowplow-wiki]. The Scaladoc website of the project can be found [here][scala-doc]. +## Benchmarking + +This project comes with [sbt-jmh](https://github.com/ktoso/sbt-jmh). + +Benchmarks need to be added [here](./benchmark/src/test/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/benchmark/). + +They can be run with `sbt "project benchmark" "+jmh:run -i 10 -wi 3 -f2 -t3"`. + +To get details about the parameters `jmh:run -h`. + ## Copyright and license The Snowplow Scala Analytics SDK is copyright 2016-2019 Snowplow Analytics Ltd. diff --git a/benchmark/build.sbt b/benchmark/build.sbt new file mode 100644 index 0000000..6e115c6 --- /dev/null +++ b/benchmark/build.sbt @@ -0,0 +1,6 @@ +sourceDirectory in Jmh := (sourceDirectory in Test).value +classDirectory in Jmh := (classDirectory in Test).value +dependencyClasspath in Jmh := (dependencyClasspath in Test).value +// rewire tasks, so that 'jmh:run' automatically invokes 'jmh:compile' (otherwise a clean 'jmh:run' would fail) +compile in Jmh := (compile in Jmh).dependsOn(compile in Test).value +run in Jmh := (run in Jmh).dependsOn(Keys.compile in Jmh).evaluated \ No newline at end of file diff --git a/benchmark/src/test/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/benchmark/BenchmarkAnalyticsSDK.scala b/benchmark/src/test/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/benchmark/BenchmarkAnalyticsSDK.scala new file mode 100644 index 0000000..ba6f97c --- /dev/null +++ b/benchmark/src/test/scala/com.snowplowanalytics.snowplow.analytics.scalasdk/benchmark/BenchmarkAnalyticsSDK.scala @@ -0,0 +1,35 @@ +package com.snowplowanalytics.snowplow.analytics.scalasdk.benchmark + +import org.openjdk.jmh.annotations._ + +import java.util.concurrent.TimeUnit +import java.util.UUID +import java.time.Instant + +import com.snowplowanalytics.snowplow.analytics.scalasdk.Event + +@State(Scope.Thread) +@BenchmarkMode(Array(Mode.AverageTime, Mode.Throughput)) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +class BenchmarkAnalyticsSDK { + @Benchmark + def ordered(state : States.AtomicEventState): Unit = { + state.event.ordered + } +} + +object States { + @State(Scope.Benchmark) + class AtomicEventState { + var event: Event = _ + + @Setup(Level.Trial) + def init(): Unit = { + val uuid = UUID.randomUUID() + val timestamp = Instant.now() + val vCollector = "2.0.0" + val vTracker = "scala_0.7.0" + event = Event.minimal(uuid, timestamp, vCollector, vTracker) + } + } +} \ No newline at end of file diff --git a/build.sbt b/build.sbt index b9befcf..83bbc17 100644 --- a/build.sbt +++ b/build.sbt @@ -42,3 +42,8 @@ lazy val root = project.in(file(".")) Dependencies.specs2 ) ) + +lazy val benchmark = project + .in(file("benchmark")) + .dependsOn(root % "test->test") + .enablePlugins(JmhPlugin) \ No newline at end of file diff --git a/project/plugins.sbt b/project/plugins.sbt index e2d1eb6..a18ac71 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -4,3 +4,4 @@ addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.6.1") addSbtPlugin("com.typesafe.sbt" % "sbt-site" % "1.4.0") addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "1.0.0") addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.6.3") +addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.0") \ No newline at end of file