Skip to content

Instantly share code, notes, and snippets.

@Randgalt
Last active August 10, 2022 10:29
Show Gist options
  • Save Randgalt/a68ceee62cd8127431cbe6e7afbfdf44 to your computer and use it in GitHub Desktop.
Save Randgalt/a68ceee62cd8127431cbe6e7afbfdf44 to your computer and use it in GitHub Desktop.
package jdk19;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;
public class TestEnhancedSwitch
{
public sealed interface Fruit
{
record Apple() implements Fruit {}
record Peach() implements Fruit {}
record Pear() implements Fruit {}
record Grapes() implements Fruit {}
record Cherries() implements Fruit {}
}
public static void main(String[] args)
throws RunnerException
{
Options opt = new OptionsBuilder()
.include(TestEnhancedSwitch.class.getSimpleName())
.threads(4)
.forks(1)
.jvmArgs("--enable-preview")
.build();
new Runner(opt).run();
}
@State(Scope.Benchmark)
public static class Data
{
public final List<Fruit> fruits;
public final Map<Class<?>, AtomicInteger> counts = new ConcurrentHashMap<>();
public Data()
{
ThreadLocalRandom random = ThreadLocalRandom.current();
int qty = random.nextInt(1000, 2000);
Class<?>[] permittedSubclasses = Fruit.class.getPermittedSubclasses();
fruits = IntStream.range(0, qty)
.mapToObj(__ -> {
Class<?> clazz = permittedSubclasses[random.nextInt(permittedSubclasses.length)];
counts.computeIfAbsent(clazz, dummy -> new AtomicInteger());
try {
return (Fruit) clazz.getConstructor().newInstance();
}
catch (Exception e) {
throw new RuntimeException(e);
}
})
.toList();
}
}
@Benchmark
public void testEnhancedSwitch(Data data)
{
for (Fruit fruit : data.fruits) {
switch (fruit) {
case Fruit.Apple __ -> data.counts.get(Fruit.Apple.class).incrementAndGet();
case Fruit.Cherries __ -> data.counts.get(Fruit.Cherries.class).incrementAndGet();
case Fruit.Grapes __ -> data.counts.get(Fruit.Grapes.class).incrementAndGet();
case Fruit.Peach __ -> data.counts.get(Fruit.Peach.class).incrementAndGet();
case Fruit.Pear __ -> data.counts.get(Fruit.Pear.class).incrementAndGet();
}
}
}
@Benchmark
public void testManualSwitch(Data data)
{
for (Fruit fruit : data.fruits) {
if (fruit.getClass().equals(Fruit.Apple.class)) {
data.counts.get(Fruit.Apple.class).incrementAndGet();
}
else if (fruit.getClass().equals(Fruit.Cherries.class)) {
data.counts.get(Fruit.Cherries.class).incrementAndGet();
}
else if (fruit.getClass().equals(Fruit.Grapes.class)) {
data.counts.get(Fruit.Grapes.class).incrementAndGet();
}
else if (fruit.getClass().equals(Fruit.Peach.class)) {
data.counts.get(Fruit.Peach.class).incrementAndGet();
}
else if (fruit.getClass().equals(Fruit.Pear.class)) {
data.counts.get(Fruit.Pear.class).incrementAndGet();
}
}
}
}
@Randgalt
Copy link
Author

Benchmark                               Mode  Cnt      Score       Error  Units
TestEnhancedSwitch.testEnhancedSwitch  thrpt    5  30789.482 ± 17667.365  ops/s
TestEnhancedSwitch.testManualSwitch    thrpt    5  44651.612 ±  5135.641  ops/s

@Randgalt
Copy link
Author

Flight Data Recorder image:

Screen Shot 2022-08-10 at 11 29 27 AM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment