我比较了JDK 8和11的性能
jmh
1.21当我遇到一些令人惊讶的数字时:
Java version: 1.8.0_192, vendor: Oracle Corporation
Benchmark Mode Cnt Score Error Units
MyBenchmark.emptyMethod avgt 25 0.362 ± 0.001 ns/op
Java version: 9.0.4, vendor: Oracle Corporation
Benchmark Mode Cnt Score Error Units
MyBenchmark.emptyMethod avgt 25 0.362 ± 0.001 ns/op
Java version: 10.0.2, vendor: Oracle Corporation
Benchmark Mode Cnt Score Error Units
MyBenchmark.emptyMethod avgt 25 0.723 ± 0.001 ns/op
Java version: 11.0.1, vendor: Oracle Corporation
Benchmark Mode Cnt Score Error Units
MyBenchmark.emptyMethod avgt 25 0.724 ± 0.002 ns/op
OpenJDK 11和12的性能与OracleJDK 11类似。为了简洁起见,我省略了他们的数字。
我理解微基准并不表示实际应用程序的性能行为。不过,我很好奇这种差异是从哪里来的。
有什么想法吗?
以下是整个基准:
XML
:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
jmh
empty-method
1.0-SNAPSHOT
jar
JMH benchmark sample: Java
org.openjdk.jmh
jmh-core
${jmh.version}
org.openjdk.jmh
jmh-generator-annprocess
${jmh.version}
provided
UTF-8
1.21
1.8
benchmarks
org.apache.maven.plugins
maven-enforcer-plugin
1.4.1
enforce-versions
enforce
3.0
org.apache.maven.plugins
maven-compiler-plugin
3.8.0
${javac.target}
${javac.target}
${javac.target}
org.apache.maven.plugins
maven-shade-plugin
3.2.1
package
shade
${uberjar.name}
org.openjdk.jmh.Main
*:*
META-INF/*.SF
META-INF/*.DSA
META-INF/*.RSA
maven-clean-plugin
2.6.1
maven-deploy-plugin
2.8.2
maven-install-plugin
2.5.2
maven-jar-plugin
3.1.0
maven-javadoc-plugin
3.0.0
maven-resources-plugin
3.1.0
maven-site-plugin
3.7.1
maven-source-plugin
3.0.1
maven-surefire-plugin
2.22.0
SRC/Ma/Java/JMH/MyBenchmark.java
:
package jmh;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class MyBenchmark
{
@Benchmark
public void emptyMethod()
{
}
}
这是我使用的特定于Windows的脚本。将其转换为其他平台应该是很简单的:
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_192
call mvn -V -Djavac.target=1.8 clean install
"%JAVA_HOME%\bin\java" -jar target\benchmarks.jar
set JAVA_HOME=C:\Program Files\Java\jdk-9.0.4
call mvn -V -Djavac.target=9 clean install
"%JAVA_HOME%\bin\java" -jar target\benchmarks.jar
set JAVA_HOME=C:\Program Files\Java\jdk-10.0.2
call mvn -V -Djavac.target=10 clean install
"%JAVA_HOME%\bin\java" -jar target\benchmarks.jar
set JAVA_HOME=C:\Program Files\Java\oracle-11.0.1
call mvn -V -Djavac.target=11 clean install
"%JAVA_HOME%\bin\java" -jar target\benchmarks.jar
我的运行时环境是:
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T14:41:47-04:00)
Maven home: C:\Program Files\apache-maven-3.6.0\bin\..
Default locale: en_CA, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
更具体地说,我正在跑步
Microsoft Windows [Version 10.0.17763.195]
.