Skip to content

Commit

Permalink
[bench] separate comparative benchmarks (#1060)
Browse files Browse the repository at this point in the history
<!--
PRs require an approval from any of the core contributors, other than
the PR author.

Include this header if applicable:
Fixes #issue1, #issue2, ...
-->

### Problem
<!--
Explain here the context, and why you're making this change. What is the
problem you're trying to solve?
-->
Kyo's benchmarks are currently all in the same module and package. As we
evolve the library, we'll likely need to introduce benchmarks that
aren't meant for comparing different effect systems. Having all
benchmarks in the same package is also inconvenient when you want to
execute only the comparative ones for example.

### Solution
<!--
Describe your solution. Focus on helping reviewers understand your
technical approach and implementation decisions.
-->
Move comparative benchmarks to a separate `kyo.bench.arena` package.
Benchmarks that don't follow the comparative pattern with sync/fork
benchmarks were kept in the `kyo.bench` package.
  • Loading branch information
fwbrasil authored Jan 29, 2025
1 parent 6e7afec commit 999807f
Show file tree
Hide file tree
Showing 53 changed files with 153 additions and 147 deletions.
21 changes: 21 additions & 0 deletions kyo-bench/src/main/scala/kyo/bench/BaseBench.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package kyo.bench

import org.openjdk.jmh.annotations.*

@State(Scope.Benchmark)
@Fork(
value = 1,
jvmArgs = Array(
"-XX:+UnlockExperimentalVMOptions",
"-XX:-DoJVMTIVirtualThreadTransitions",
"-Dcom.sun.management.jmxremote",
"-Dcom.sun.management.jmxremote.port=1099",
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=false"
),
jvmArgsPrepend = Array(
"--add-opens=java.base/java.lang=ALL-UNNAMED"
)
)
@BenchmarkMode(Array(Mode.Throughput))
class BaseBench
2 changes: 1 addition & 1 deletion kyo-bench/src/main/scala/kyo/bench/ChunkBench.scala
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import scala.reflect.ClassTag
import scala.util.Random
import zio.Chunk as ZChunk

class ChunkBench extends Bench(()):
class ChunkBench extends BaseBench:
@Param(Array("1024", "1048576"))
var size: Int = uninitialized

Expand Down
2 changes: 1 addition & 1 deletion kyo-bench/src/main/scala/kyo/bench/MtlBench.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ case class EnvValue(config: String)
case class Event(name: String)
case class State(value: Int)

class MtlBench extends Bench(()):
class MtlBench extends BaseBench:

val loops = (1 to 1000).toList

Expand Down
2 changes: 1 addition & 1 deletion kyo-bench/src/main/scala/kyo/bench/TagsBench.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package kyo.bench

import org.openjdk.jmh.annotations.Benchmark

class TagsBench extends Bench(()):
class TagsBench extends BaseBench:

class Super
class Sub1 extends Super
Expand Down
2 changes: 1 addition & 1 deletion kyo-bench/src/main/scala/kyo/bench/TypeMapBench.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import scala.compiletime.uninitialized
import zio.ZEnvironment

// Based on: https://github.com/zio/zio/blob/series/2.x/benchmarks/src/main/scala/zio/ZEnvironmentBenchmark.scala
class TypeMapBench extends Bench(()):
class TypeMapBench extends BaseBench:
import BenchmarkedEnvironment.*

var zioEnv: ZEnvironment[Env] = uninitialized
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,10 @@
package kyo.bench
package kyo.bench.arena

import WarmupJITProfile.*
import kyo.bench.BaseBench
import org.openjdk.jmh.annotations.*

@State(Scope.Benchmark)
@Fork(
value = 1,
jvmArgs = Array(
"-XX:+UnlockExperimentalVMOptions",
"-XX:-DoJVMTIVirtualThreadTransitions",
"-Dcom.sun.management.jmxremote",
"-Dcom.sun.management.jmxremote.port=1099",
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=false"
),
jvmArgsPrepend = Array(
"--add-opens=java.base/java.lang=ALL-UNNAMED"
)
)
@BenchmarkMode(Array(Mode.Throughput))
abstract class Bench[A](val expectedResult: A):
abstract class ArenaBench[A](val expectedResult: A) extends BaseBench:
private var finalizers: List[() => Unit] = Nil

@TearDown
Expand All @@ -45,11 +30,11 @@ abstract class Bench[A](val expectedResult: A):
kyo.KyoSchedulerIORuntime.global
else
cats.effect.unsafe.implicits.global
end Bench
end ArenaBench

object Bench:
object ArenaBench:

abstract class Base[A](expectedResult: A) extends Bench[A](expectedResult):
abstract class Base[A](expectedResult: A) extends ArenaBench[A](expectedResult):
def zioBench(): zio.UIO[A]
def kyoBenchFiber(): kyo.<[A, kyo.Async & kyo.Abort[Throwable]] = kyoBench()
def kyoBench(): kyo.<[A, kyo.IO]
Expand Down Expand Up @@ -95,4 +80,4 @@ object Bench:
zioRuntime.run(zioBench()).getOrThrow()
)
end SyncAndFork
end Bench
end ArenaBench
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class BatchBench extends Bench.SyncAndFork(5050):
class BatchBench extends ArenaBench.SyncAndFork(5050):

val count = 100

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package kyo.bench
package kyo.bench.arena

import java.util.concurrent.locks.LockSupport

class BlockingBench extends Bench.ForkOnly(()):
class BlockingBench extends ArenaBench.ForkOnly(()):

def block(): Unit =
LockSupport.parkNanos(100000) // 0.1 ms
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package kyo.bench
package kyo.bench.arena

import java.util.concurrent.locks.LockSupport

class BlockingContentionBench extends Bench.ForkOnly(()):
class BlockingContentionBench extends ArenaBench.ForkOnly(()):

val concurrency = Runtime.getRuntime().availableProcessors() * 30

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package kyo.bench
package kyo.bench.arena

import org.openjdk.jmh.annotations.*

class BroadFlatMapBench extends Bench.SyncAndFork(BigInt(610)):
class BroadFlatMapBench extends ArenaBench.SyncAndFork(BigInt(610)):

val depth = 15

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class CollectBench extends Bench.SyncAndFork(Seq.fill(1000)(1)):
class CollectBench extends ArenaBench.SyncAndFork(Seq.fill(1000)(1)):

val count = 1000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class CollectParBench extends Bench.ForkOnly(Seq.fill(1000)(1)):
class CollectParBench extends ArenaBench.ForkOnly(Seq.fill(1000)(1)):

val count = 1000
val kyoTasks = List.fill(count)(kyo.IO(1))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class CountdownLatchBench extends Bench.ForkOnly(0):
class CountdownLatchBench extends ArenaBench.ForkOnly(0):

val depth = 10000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class DeepBindBench extends Bench.SyncAndFork(()):
class DeepBindBench extends ArenaBench.SyncAndFork(()):

val depth = 10000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class DeepBindMapBench extends Bench.SyncAndFork(10001):
class DeepBindMapBench extends ArenaBench.SyncAndFork(10001):

val depth = 10000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class EnqueueDequeueBench extends Bench.ForkOnly(()):
class EnqueueDequeueBench extends ArenaBench.ForkOnly(()):

val depth = 10000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kyo.bench
package kyo.bench.arena

class Ex1 extends Exception derives CanEqual
object Ex1 extends Ex1
Expand All @@ -7,7 +7,7 @@ object Ex2 extends Ex2
class Ex3 extends Exception derives CanEqual
object Ex3 extends Ex3

class FailureBench extends Bench.SyncAndFork[Either[Ex1 | Ex2, Int]](Left(Ex2)):
class FailureBench extends ArenaBench.SyncAndFork[Either[Ex1 | Ex2, Int]](Left(Ex2)):

val depth = 100

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package kyo.bench
package kyo.bench.arena

import org.openjdk.jmh.annotations.*

class ForkChainedBench extends Bench.ForkOnly(0):
class ForkChainedBench extends ArenaBench.ForkOnly(0):

val depth = 10000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package kyo.bench
package kyo.bench.arena

import org.openjdk.jmh.annotations.*

class ForkJoinBench extends Bench.ForkOnly(()):
class ForkJoinBench extends ArenaBench.ForkOnly(()):

val depth = 10000
val range = (0 until depth).toList
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package kyo.bench
package kyo.bench.arena

import org.openjdk.jmh.annotations.*

class ForkJoinContentionBench extends Bench.ForkOnly(()):
class ForkJoinContentionBench extends ArenaBench.ForkOnly(()):

val depth = 1000
val parallism = Runtime.getRuntime().availableProcessors()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package kyo.bench
package kyo.bench.arena

import org.openjdk.jmh.annotations.*

class ForkManyBench extends Bench.ForkOnly(0):
class ForkManyBench extends ArenaBench.ForkOnly(0):

val depth = 10000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package kyo.bench
package kyo.bench.arena

import org.openjdk.jmh.annotations.*

class ForkSpawnBench extends Bench.ForkOnly(()):
class ForkSpawnBench extends ArenaBench.ForkOnly(()):

val depth = 5
val width = 10
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package kyo.bench
package kyo.bench.arena

import org.http4s.ember.client.EmberClientBuilder

class HttpClientBench extends Bench.ForkOnly("pong"):
class HttpClientBench extends ArenaBench.ForkOnly("pong"):

override lazy val zioRuntimeLayer = super.zioRuntimeLayer.merge(zio.http.Client.default)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package kyo.bench
package kyo.bench.arena

import org.http4s.ember.client.EmberClientBuilder

class HttpClientContentionBench
extends Bench.ForkOnly(Seq.fill(Runtime.getRuntime().availableProcessors())("pong")):
extends ArenaBench.ForkOnly(Seq.fill(Runtime.getRuntime().availableProcessors())("pong")):
override val zioRuntimeLayer = super.zioRuntimeLayer.merge(zio.http.Client.default)

val concurrency = Runtime.getRuntime().availableProcessors()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class LoggingBench extends Bench.SyncAndFork(()):
class LoggingBench extends ArenaBench.SyncAndFork(()):

val depth = 10000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class NarrowBindBench extends Bench.SyncAndFork(10000):
class NarrowBindBench extends ArenaBench.SyncAndFork(10000):

val depth = 10000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class NarrowBindMapBench extends Bench.SyncAndFork(10000):
class NarrowBindMapBench extends ArenaBench.SyncAndFork(10000):

val depth = 10000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class PingPongBench extends Bench.ForkOnly(()):
class PingPongBench extends ArenaBench.ForkOnly(()):

val depth = 1000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package kyo.bench
package kyo.bench.arena

import org.openjdk.jmh.annotations.Benchmark

class ProducerConsumerBench extends Bench.ForkOnly(()):
class ProducerConsumerBench extends ArenaBench.ForkOnly(()):

val depth = 10000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class RandomBench extends Bench.SyncAndFork(()):
class RandomBench extends ArenaBench.SyncAndFork(()):

val depth = 10000

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kyo.bench
package kyo.bench.arena

import java.io.BufferedReader
import java.io.File
Expand All @@ -8,7 +8,7 @@ import scala.jdk.CollectionConverters.*

object Registry:

def loadAll(): Seq[Bench[?]] =
def loadAll(): Seq[ArenaBench[?]] =
val packageName = this.getClass.getPackage.getName
val classes =
findClasses(packageName)
Expand All @@ -20,7 +20,7 @@ object Registry:
val constructor = cls.getConstructors.find(_.getParameterCount == 0)
constructor match
case Some(ctor) =>
ctor.newInstance().asInstanceOf[Bench[?]]
ctor.newInstance().asInstanceOf[ArenaBench[?]]
case None =>
kyo.bug(s"Class ${cls.getSimpleName} does not have an empty constructor")
end match
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package kyo.bench
package kyo.bench.arena

import org.openjdk.jmh.annotations.*

class RendezvousBench extends Bench.ForkOnly(10000 * (10000 + 1) / 2):
class RendezvousBench extends ArenaBench.ForkOnly(10000 * (10000 + 1) / 2):

given canEqualNull[A]: CanEqual[A, A | Null] = CanEqual.derived

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kyo.bench
package kyo.bench.arena

class SchedulingBench extends Bench.ForkOnly(1001000):
class SchedulingBench extends ArenaBench.ForkOnly(1001000):

val depth = 1000
val range = List.range(0, depth)
Expand Down
Loading

0 comments on commit 999807f

Please sign in to comment.