diff --git a/benchmarks/src/jmh/kotlin/benchmarks/ChannelNanoBenchmarkConflated.kt b/benchmarks/src/jmh/kotlin/benchmarks/ChannelNanoBenchmarkConflated.kt new file mode 100644 index 0000000000..ab2e25801f --- /dev/null +++ b/benchmarks/src/jmh/kotlin/benchmarks/ChannelNanoBenchmarkConflated.kt @@ -0,0 +1,26 @@ +package benchmarks + +import kotlinx.coroutines.channels.* +import org.openjdk.jmh.annotations.* +import java.util.concurrent.* + +@Warmup(iterations = 30, time = 1) +@Measurement(iterations = 30, time = 1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(1) +open class ChannelNanoBenchmarkConflated { + var channel: Channel = Channel(Channel.CONFLATED) + + @Benchmark + fun trySend() { + channel.trySend(42) + } + + @Benchmark + fun trySendTryReceive(): Int { + channel.trySend(42) + return channel.tryReceive().getOrThrow() + } +} diff --git a/benchmarks/src/jmh/kotlin/benchmarks/ChannelNanoBenchmarkUnlimited.kt b/benchmarks/src/jmh/kotlin/benchmarks/ChannelNanoBenchmarkUnlimited.kt new file mode 100644 index 0000000000..eb771b623c --- /dev/null +++ b/benchmarks/src/jmh/kotlin/benchmarks/ChannelNanoBenchmarkUnlimited.kt @@ -0,0 +1,36 @@ +package benchmarks + +import kotlinx.coroutines.channels.* +import org.openjdk.jmh.annotations.* +import java.util.concurrent.* + +@Warmup(iterations = 30, time = 1) +@Measurement(iterations = 30, time = 1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@Fork(1) +open class ChannelNanoBenchmarkUnlimited { + @State(Scope.Benchmark) + open class PrefilledChannelState { + private val list = List(1_000_000) { it } + + @Param(value = ["0", "10000", "100000", "1000000"]) // 0, 40, 400 KB, 4 MB + private var prefill = 0 + + lateinit var channel: Channel + + @Setup(Level.Trial) + fun createPrefilledChannel() { + channel = Channel(Channel.UNLIMITED) + repeat(prefill) { + channel.trySend(list[it]) + } + } + } + + @Benchmark + fun trySendTryReceive(s: PrefilledChannelState): Int { + s.channel.trySend(42) + return s.channel.tryReceive().getOrThrow() + } +} diff --git a/benchmarks/src/jmh/kotlin/benchmarks/examples/CounterBenchmark.kt b/benchmarks/src/jmh/kotlin/benchmarks/examples/CounterBenchmark.kt new file mode 100644 index 0000000000..cf6db08764 --- /dev/null +++ b/benchmarks/src/jmh/kotlin/benchmarks/examples/CounterBenchmark.kt @@ -0,0 +1,19 @@ +package benchmarks.examples + +import org.openjdk.jmh.annotations.* +import java.util.concurrent.TimeUnit + +@Warmup(iterations = 10, time = 1) +@Measurement(iterations = 10, time = 1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(1) +open class CounterBenchmark { + var counter: ULong = 0u + + @Benchmark + fun inc() { + counter++ + } +} diff --git a/benchmarks/src/jmh/kotlin/benchmarks/examples/ListBenchmark.kt b/benchmarks/src/jmh/kotlin/benchmarks/examples/ListBenchmark.kt new file mode 100644 index 0000000000..657174385e --- /dev/null +++ b/benchmarks/src/jmh/kotlin/benchmarks/examples/ListBenchmark.kt @@ -0,0 +1,48 @@ +package benchmarks.examples + +import org.openjdk.jmh.annotations.* +import java.util.concurrent.TimeUnit + +@Warmup(iterations = 10, time = 1) +@Measurement(iterations = 10, time = 1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@Fork(1) +open class ListBenchmark { + @State(Scope.Benchmark) + open class PrefilledList { + @Param("0", "100000", "1000000", "10000000") + var prefill = 0 + + val lst: MutableList = mutableListOf(42) + + @Setup(Level.Iteration) + fun setup() { + repeat(prefill) { lst.add(it) } + } + } + + @Benchmark + fun add(s: PrefilledList) { + s.lst.add(42) + } + + @State(Scope.Benchmark) + open class PrefilledReusableList { + @Param("0", "100000", "1000000", "10000000") + var prefill = 0 + + val lst: MutableList = mutableListOf(42) + + @Setup(Level.Trial) + fun setup() { + repeat(prefill) { lst.add(it) } + } + } + + @Benchmark + fun addRemoveLast(s: PrefilledReusableList) { + s.lst.add(42) + s.lst.removeLast() + } +}