Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Microbenchmarking #21

Merged
merged 6 commits into from
Aug 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package net.marek.tyre.benchmark

import org.openjdk.jmh.annotations.{Benchmark, Scope, State}
import net.marek.tyre.*
import scala.util.Random

@State(Scope.Thread)
class RegexBenchmark:

@Benchmark
def runTimeRegex: Unit = timeData.foreach:
case regexTimeParser(h, m) => (h.toInt, m.toInt)

@Benchmark
def runTimeTyre: Unit = timeData.foreach(tyreTimeParser.run)

@Benchmark
def runEmailRegex15: Unit = emailData15.foreach:
case regexEmailParser(u, d) => (u, d)

@Benchmark
def runEmailTyre15: Unit = emailData15.foreach(tyreEmailParser.run)

@Benchmark
def runEmailTyre45: Unit = emailData45.foreach(tyreEmailParser.run)

@Benchmark
def runEmailTyre75: Unit = emailData75.foreach(tyreEmailParser.run)

@Benchmark
def runEmailTyre105: Unit = emailData105.foreach(tyreEmailParser.run)

@Benchmark
def runEmailTyre135: Unit = emailData135.foreach(tyreEmailParser.run)

private val tyreTimeParser =
val ht = tyre"[0-1]\d|2[0-3]"
val mt = tyre"[0-5]\d"
val tt = tyre"$ht:$mt".map: t =>
val ((h10, h1), _, m10, m1) = t
(h10.toInt * 10 + h1.toInt, m10.toInt * 10 + m1.toInt)
tt.compile()

private val regexTimeParser = """([0-1]\d|2[0-3]):([0-5]\d)""".r

private val tyreEmailParser =
val ut = tyre".+!s"
val dt = tyre"(.+\..+)!s"
val et = tyre"$ut@$dt"
et.compile()

private val regexEmailParser = """(.+)@(.+\..+)""".r

private val rand = Random()

private def drawTime =
val h = rand.between(0, 24)
val m = rand.between(0, 60)
f"$h%02d:$m%02d"
private val timeData = List.tabulate(1_000)(_ => drawTime)

private def drawLetter = rand.between('a', 'z' + 1).toChar
private def drawEmail(length: Int) =
val u = List.tabulate(length)(_ => drawLetter).toString
val d = List.tabulate(length)(_ => drawLetter).toString
s"$u@$d.com"
// the total lenght is 2*lenght+5 -> user, domain and constant part
private val emailData15 = List.tabulate(1_000)(_ => drawEmail(5))
private val emailData45 = List.tabulate(1_000)(_ => drawEmail(20))
private val emailData75 = List.tabulate(1_000)(_ => drawEmail(35))
private val emailData105 = List.tabulate(1_000)(_ => drawEmail(50))
private val emailData135 = List.tabulate(1_000)(_ => drawEmail(65))
19 changes: 14 additions & 5 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,20 @@ lazy val basicSettings = Seq(
name := "tyre-scala",
description := "Typed regex parser",
homepage := Some(url("https://github.com/kasiaMarek/tyre-scala")),
scalaVersion := "3.3.1"
scalaVersion := "3.3.3"
)

addCommandAlias("validate", "; compile; Test/compile; scalafmtCheck; test")
addCommandAlias("evaluate", "; test; project benchmark; Jmh/run -i 3 -wi 1 -f1 -t1; project root")

lazy val root = (project in file("."))
.settings(basicSettings: _*)
.settings(
licenses += ("Apache-2.0", new URI("https://www.apache.org/licenses/LICENSE-2.0.txt").toURL),
versionScheme := Some("semver-spec"),
libraryDependencies ++= Seq(
"org.scala-lang.modules" % "scala-parser-combinators_3" % "2.3.0",
"org.scalatest" %% "scalatest" % "3.2.16" % Test
"org.scala-lang.modules" % "scala-parser-combinators_3" % "2.4.0",
"org.scalatest" %% "scalatest" % "3.2.19" % Test
),
Test / fork := true,
javaOptions += "-Dfile.encoding=UTF-8",
Expand All @@ -28,17 +29,25 @@ lazy val root = (project in file("."))
)
.settings(publishSettings: _*)

lazy val benchmark = (project in file("benchmark"))
.settings(basicSettings: _*)
.settings(
name := "tyre-benchmark"
)
.enablePlugins(JmhPlugin)
.dependsOn(root)

lazy val scalacSettings = Seq(
"-deprecation", // Emit warning and location for usages of deprecated APIs.
"-explain", // Explain errors in more detail.
"-explain-types", // Explain type errors in more detail.
"-feature", // Emit warning and location for usages of features that should be imported explicitly.
"-language:higherKinds,implicitConversions", // Enable language features.
"-new-syntax", // Require Scala 3 syntax
"-new-syntax", // Require Scala 3 syntax
"-pagewidth:120", // Set output page width.
"-unchecked", // Enable additional warnings where generated code depends on assumptions.
"-Wvalue-discard", // Warn about unused expression results.
"-Wunused:all", // Warn about unused code
"-Wunused:all", // Warn about unused code
"-Wconf:cat=deprecation:w,unused:w,any:e", // Fail the compilation if there are any warnings except deprecation.
"-Xtarget:17", // Set target JVM version.
"-Xverify-signatures", // Verify generic signatures in generated bytecode.
Expand Down
1 change: 1 addition & 0 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2")
addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.12")
addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.7")