Skip to content

Instantly share code, notes, and snippets.

@ozkanpakdil
Last active May 26, 2022 22:13
Show Gist options
  • Save ozkanpakdil/a54a011e56dfe6aeda3c2a3772851ecf to your computer and use it in GitHub Desktop.
Save ozkanpakdil/a54a011e56dfe6aeda3c2a3772851ecf to your computer and use it in GitHub Desktop.
java benchmark for stream api
```java
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.openjdk.jmh.runner.options.TimeValue;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
public class DemoApplicationTests {
@Test
public void runBenchmarks() throws Exception {
Options options = new OptionsBuilder()
.include(this.getClass().getName() + ".*")
.mode(Mode.AverageTime)
.warmupTime(TimeValue.seconds(1))
.warmupIterations(2)
.threads(1)
.measurementIterations(2)
.forks(1)
.shouldFailOnError(true)
.shouldDoGC(true)
.build();
new Runner(options).run();
}
public void testStreamCode() {
int num = 123;
AtomicReference<String> str = new AtomicReference<>();
String.valueOf(num).chars().boxed().sorted(Collections.reverseOrder()).forEach(c -> str.updateAndGet(v -> v + (c - 48)));
int parseInt = Integer.parseInt(str.get().replaceAll("null", ""));
assert parseInt == 321;
}
public void testArraysSortCode() {
int num = 7657585;
char[] c = String.valueOf(num).toCharArray();
Arrays.sort(c);
String s = "";
for (int i = c.length - 1; i >= 0; i--)
s += c[i];
Integer integer = Integer.valueOf(s);
assert integer == 8776555;
}
public void cw() {
int num = 7657585;
int i1 = Integer.parseInt(String.valueOf(num)
.chars()
.mapToObj(i -> String.valueOf(Character.getNumericValue(i)))
.sorted(Comparator.reverseOrder())
.collect(Collectors.joining()));
assert i1 == 8776555;
}
}
```
benchmark result is
```
/usr/lib/jvm/graalvm-ce-java17-22.0.0.2/bin/java -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:/snap/intellij-idea-community/361/lib/idea_rt.jar=33845:/snap/intellij-idea-community/361/bin -Dfile.encoding=UTF-8 -classpath /home/mlinux/.m2/repository/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2.jar:/snap/intellij-idea-community/361/lib/idea_rt.jar:/snap/intellij-idea-community/361/plugins/junit/lib/junit5-rt.jar:/snap/intellij-idea-community/361/plugins/junit/lib/junit-rt.jar:/home/mlinux/tmp/demo/target/test-classes:/home/mlinux/tmp/demo/target/classes:/home/mlinux/.m2/repository/org/springframework/boot/spring-boot-starter/2.7.0/spring-boot-starter-2.7.0.jar:/home/mlinux/.m2/repository/org/springframework/boot/spring-boot/2.7.0/spring-boot-2.7.0.jar:/home/mlinux/.m2/repository/org/springframework/spring-context/5.3.20/spring-context-5.3.20.jar:/home/mlinux/.m2/repository/org/springframework/spring-aop/5.3.20/spring-aop-5.3.20.jar:/home/mlinux/.m2/repository/org/springframework/spring-beans/5.3.20/spring-beans-5.3.20.jar:/home/mlinux/.m2/repository/org/springframework/spring-expression/5.3.20/spring-expression-5.3.20.jar:/home/mlinux/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.7.0/spring-boot-autoconfigure-2.7.0.jar:/home/mlinux/.m2/repository/org/springframework/boot/spring-boot-starter-logging/2.7.0/spring-boot-starter-logging-2.7.0.jar:/home/mlinux/.m2/repository/ch/qos/logback/logback-classic/1.2.11/logback-classic-1.2.11.jar:/home/mlinux/.m2/repository/ch/qos/logback/logback-core/1.2.11/logback-core-1.2.11.jar:/home/mlinux/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.17.2/log4j-to-slf4j-2.17.2.jar:/home/mlinux/.m2/repository/org/apache/logging/log4j/log4j-api/2.17.2/log4j-api-2.17.2.jar:/home/mlinux/.m2/repository/org/slf4j/jul-to-slf4j/1.7.36/jul-to-slf4j-1.7.36.jar:/home/mlinux/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/home/mlinux/.m2/repository/org/springframework/spring-core/5.3.20/spring-core-5.3.20.jar:/home/mlinux/.m2/repository/org/springframework/spring-jcl/5.3.20/spring-jcl-5.3.20.jar:/home/mlinux/.m2/repository/org/yaml/snakeyaml/1.30/snakeyaml-1.30.jar:/home/mlinux/.m2/repository/org/springframework/boot/spring-boot-starter-test/2.7.0/spring-boot-starter-test-2.7.0.jar:/home/mlinux/.m2/repository/org/springframework/boot/spring-boot-test/2.7.0/spring-boot-test-2.7.0.jar:/home/mlinux/.m2/repository/org/springframework/boot/spring-boot-test-autoconfigure/2.7.0/spring-boot-test-autoconfigure-2.7.0.jar:/home/mlinux/.m2/repository/com/jayway/jsonpath/json-path/2.7.0/json-path-2.7.0.jar:/home/mlinux/.m2/repository/net/minidev/json-smart/2.4.8/json-smart-2.4.8.jar:/home/mlinux/.m2/repository/net/minidev/accessors-smart/2.4.8/accessors-smart-2.4.8.jar:/home/mlinux/.m2/repository/org/ow2/asm/asm/9.1/asm-9.1.jar:/home/mlinux/.m2/repository/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar:/home/mlinux/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3.jar:/home/mlinux/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar:/home/mlinux/.m2/repository/org/assertj/assertj-core/3.22.0/assertj-core-3.22.0.jar:/home/mlinux/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar:/home/mlinux/.m2/repository/org/junit/jupiter/junit-jupiter/5.8.2/junit-jupiter-5.8.2.jar:/home/mlinux/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.8.2/junit-jupiter-api-5.8.2.jar:/home/mlinux/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar:/home/mlinux/.m2/repository/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2.jar:/home/mlinux/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar:/home/mlinux/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.8.2/junit-jupiter-params-5.8.2.jar:/home/mlinux/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.8.2/junit-jupiter-engine-5.8.2.jar:/home/mlinux/.m2/repository/org/junit/platform/junit-platform-engine/1.8.2/junit-platform-engine-1.8.2.jar:/home/mlinux/.m2/repository/org/mockito/mockito-core/4.5.1/mockito-core-4.5.1.jar:/home/mlinux/.m2/repository/net/bytebuddy/byte-buddy/1.12.10/byte-buddy-1.12.10.jar:/home/mlinux/.m2/repository/net/bytebuddy/byte-buddy-agent/1.12.10/byte-buddy-agent-1.12.10.jar:/home/mlinux/.m2/repository/org/objenesis/objenesis/3.2/objenesis-3.2.jar:/home/mlinux/.m2/repository/org/mockito/mockito-junit-jupiter/4.5.1/mockito-junit-jupiter-4.5.1.jar:/home/mlinux/.m2/repository/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0.jar:/home/mlinux/.m2/repository/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1.jar:/home/mlinux/.m2/repository/org/springframework/spring-test/5.3.20/spring-test-5.3.20.jar:/home/mlinux/.m2/repository/org/xmlunit/xmlunit-core/2.9.0/xmlunit-core-2.9.0.jar:/home/mlinux/.m2/repository/org/openjdk/jmh/jmh-core/1.35/jmh-core-1.35.jar:/home/mlinux/.m2/repository/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar:/home/mlinux/.m2/repository/org/apache/commons/commons-math3/3.2/commons-math3-3.2.jar:/home/mlinux/.m2/repository/org/openjdk/jmh/jmh-generator-annprocess/1.35/jmh-generator-annprocess-1.35.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 com.example.demo.DemoApplicationTests
# JMH version: 1.35
# VM version: JDK 17.0.2, OpenJDK 64-Bit Server VM, 17.0.2+8-jvmci-22.0-b05
# VM invoker: /usr/lib/jvm/graalvm-ce-java17-22.0.0.2/bin/java
# VM options: -XX:ThreadPriorityPolicy=1 -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCIProduct -XX:-UnlockExperimentalVMOptions -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:/snap/intellij-idea-community/361/lib/idea_rt.jar=33845:/snap/intellij-idea-community/361/bin -Dfile.encoding=UTF-8
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 2 iterations, 1 s each
# Measurement: 2 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: com.example.demo.DemoApplicationTests.cw
# Run progress: 0.00% complete, ETA 00:00:24
# Warmup Fork: 1 of 1
OpenJDK 64-Bit Server VM warning: -XX:ThreadPriorityPolicy=1 may require system level permission, e.g., being the root user. If the necessary permission is not possessed, changes to priority will be silently ignored.
# Warmup Iteration 1: 1.088 us/op
# Warmup Iteration 2: 0.924 us/op
Iteration 1: 0.805 us/op
Iteration 2: 0.828 us/op
# Run progress: 16.67% complete, ETA 00:00:37
# Fork: 1 of 1
OpenJDK 64-Bit Server VM warning: -XX:ThreadPriorityPolicy=1 may require system level permission, e.g., being the root user. If the necessary permission is not possessed, changes to priority will be silently ignored.
# Warmup Iteration 1: 1.384 us/op
# Warmup Iteration 2: 0.919 us/op
Iteration 1: 0.790 us/op
Iteration 2: 0.827 us/op
Result "com.example.demo.DemoApplicationTests.cw":
0.808 us/op
# JMH version: 1.35
# VM version: JDK 17.0.2, OpenJDK 64-Bit Server VM, 17.0.2+8-jvmci-22.0-b05
# VM invoker: /usr/lib/jvm/graalvm-ce-java17-22.0.0.2/bin/java
# VM options: -XX:ThreadPriorityPolicy=1 -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCIProduct -XX:-UnlockExperimentalVMOptions -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:/snap/intellij-idea-community/361/lib/idea_rt.jar=33845:/snap/intellij-idea-community/361/bin -Dfile.encoding=UTF-8
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 2 iterations, 1 s each
# Measurement: 2 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: com.example.demo.DemoApplicationTests.testArraysSortCode
# Run progress: 33.33% complete, ETA 00:00:29
# Warmup Fork: 1 of 1
OpenJDK 64-Bit Server VM warning: -XX:ThreadPriorityPolicy=1 may require system level permission, e.g., being the root user. If the necessary permission is not possessed, changes to priority will be silently ignored.
# Warmup Iteration 1: 0.278 us/op
# Warmup Iteration 2: 0.195 us/op
Iteration 1: 0.221 us/op
Iteration 2: 0.189 us/op
# Run progress: 50.00% complete, ETA 00:00:22
# Fork: 1 of 1
OpenJDK 64-Bit Server VM warning: -XX:ThreadPriorityPolicy=1 may require system level permission, e.g., being the root user. If the necessary permission is not possessed, changes to priority will be silently ignored.
# Warmup Iteration 1: 0.249 us/op
# Warmup Iteration 2: 0.208 us/op
Iteration 1: 0.197 us/op
Iteration 2: 0.192 us/op
Result "com.example.demo.DemoApplicationTests.testArraysSortCode":
0.194 us/op
# JMH version: 1.35
# VM version: JDK 17.0.2, OpenJDK 64-Bit Server VM, 17.0.2+8-jvmci-22.0-b05
# VM invoker: /usr/lib/jvm/graalvm-ce-java17-22.0.0.2/bin/java
# VM options: -XX:ThreadPriorityPolicy=1 -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCIProduct -XX:-UnlockExperimentalVMOptions -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:/snap/intellij-idea-community/361/lib/idea_rt.jar=33845:/snap/intellij-idea-community/361/bin -Dfile.encoding=UTF-8
# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 2 iterations, 1 s each
# Measurement: 2 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: com.example.demo.DemoApplicationTests.testStreamCode
# Run progress: 66.67% complete, ETA 00:00:14
# Warmup Fork: 1 of 1
OpenJDK 64-Bit Server VM warning: -XX:ThreadPriorityPolicy=1 may require system level permission, e.g., being the root user. If the necessary permission is not possessed, changes to priority will be silently ignored.
# Warmup Iteration 1: 2.175 us/op
# Warmup Iteration 2: 1.282 us/op
Iteration 1: 0.992 us/op
Iteration 2: 0.962 us/op
# Run progress: 83.33% complete, ETA 00:00:07
# Fork: 1 of 1
OpenJDK 64-Bit Server VM warning: -XX:ThreadPriorityPolicy=1 may require system level permission, e.g., being the root user. If the necessary permission is not possessed, changes to priority will be silently ignored.
# Warmup Iteration 1: 2.093 us/op
# Warmup Iteration 2: 1.059 us/op
Iteration 1: 0.918 us/op
Iteration 2: 0.851 us/op
Result "com.example.demo.DemoApplicationTests.testStreamCode":
0.884 us/op
# Run complete. Total time: 00:00:44
REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on
why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial
experiments, perform baseline and negative tests that provide experimental control, make sure
the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts.
Do not assume the numbers tell you what you want them to tell.
NOTE: Current JVM experimentally supports Compiler Blackholes, and they are in use. Please exercise
extra caution when trusting the results, look into the generated code to check the benchmark still
works, and factor in a small probability of new VM bugs. Additionally, while comparisons between
different JVMs are already problematic, the performance difference caused by different Blackhole
modes can be very significant. Please make sure you use the consistent Blackhole mode for comparisons.
Benchmark Mode Cnt Score Error Units
DemoApplicationTests.cw avgt 2 0.808 us/op
DemoApplicationTests.testArraysSortCode avgt 2 0.194 us/op
DemoApplicationTests.testStreamCode avgt 2 0.884 us/op
Process finished with exit code 0
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment