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() + } +}