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

[bench] separate comparative benchmarks #1060

Merged
merged 5 commits into from
Jan 29, 2025
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
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
Loading