SPECjvm2008 Benchmark - openjdk-riscv/jdk11u GitHub Wiki
- Java虚拟机基准测试,其重点是执行单个应用程序的JRE的性能。
- 反映了硬件处理器和内存子系统的性能,但对文件I/O的依赖性较低。
- 利用现实生活中的应用程序和以区域为中心的基准测试。
- startup.helloworld
- startup.compiler.compiler
- startup.compiler.sunflow
- startup.compress
- startup.crypto.aes
- startup.crypto.rsa
- startup.crypto.signverify
- startup.mpegaudio
- startup.scimark.fft
- startup.scimark.lu
- startup.scimark.monte_carlo
- startup.scimark.sor
- startup.scimark.sparse
- startup.serial
- startup.sunflow
- startup.xml.transform
- startup.xml.validation
- compiler.compiler
- compiler.sunflow
- compress
- crypto.aes
- crypto.rsa
- crypto.signverify
- derby
- mpegaudio
- scimark.fft.large
- scimark.lu.large
- scimark.sor.large
- scimark.sparse.large
- scimark.fft.small
- scimark.lu.small
- scimark.sor.small
- scimark.sparse.small
- scimark.monte_carlo
- serial
- sunflow
- xml.transform
- xml.validation
安装SPECjvm2008前需要安装本机架构版本的JDK,可以使用apt来进行安装
$ sudo apt install openjdk-11-jdk
或者使用之前交叉编译时使用的bootjdk
$ export PATH=/path/to/jdk-10/bin:$PATH
$ java -jar SPECjvm2008_1_01_setup.jar -i console
# 输入安装界面提示的语言或直接回车默认选择英语,之后按提示输入回车以及Y
# 看到'ENTER AN ABSOLUTE PATH, OR PRESS <ENTER> TO ACCEPT THE DEFAULT'提示后输入安装目录的绝对路径
$ /path/to/SPECjvm2008
# 之后按提示输入回车以及Y,显示'Congratulations. SPECjvm2008 has been successfully installed to: xxx'后表示安装成功,输入回车退出安装程序
如果要使用QEMU用户模式来对构建的RISCV32 JDK进行测试,需要使用脚本包裹相关的二进制文件,请参考 Run-or-debug-with-QEMU-user-mode
首先需要配置环境
$ export JAVA_HOME=/path/to/jdk
$ export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:/lib.dt.jar
$ export PATH=$PATH:$JAVA_HOME/bin
配置好以上的环境变量后在SPECjvm2008目录下执行:
$ cd SPECjvm2008
$ run-specjvm.sh
不带参数运行脚本默认会运行所有case,如果想要测试单个case,需要在后面加上参数:
$ run-specjvm.sh startup.helloworld
这种方法需要配置相关变量并且不能灵活使用JVM或者其本身所支持的参数,除此之外对于交叉编译的JDK可能出现各种问题,所以我们通常选择第二种方法。
由于SPECjvm2008所内置的编译器版本较低,在运行某些case时可能会出现假死问题,例如:
警告:spec.benchmarks.compiler.SpecFileManager$CachedFileObject@4fb64261: 主版本 52 比 51 新,此编译器支持最新的主版本。
建议升级此编译器。
或者提示javac版本检查失败:
The javac version test in check failed
所以我们通常在进行验证测试,而不是要提交结果的时候可以添加一下三个参数,以保证测试的顺利进行:
Arg | Long arg | Property name | Description |
---|---|---|---|
-coe | --continueOnError | specjvm.continue.on.error | Continue to run suite, even if one test fails. |
-ict | --ignoreCheckTest | specjvm.run.initial.check | Do not run check benchmark. |
-ikv | --ignoreKitValidation | specjvm.run.checksum.validation | Do not run checksum validition of benchmark kit. |
测试单个case:
$ /path/to/jdk/java -jar SPECjvm2008.jar -ikv -ict -coe startup.helloworld
执行完整的测试并记录日志,例:
$ /path/to/jdk/java -jar SPECjvm2008.jar -ikv -ict -coe > SPECjvm2008.log 2>&1
其他常用可选参数
-
-i/--iterations
表示要运行多少次迭代,“ inf”表示无穷大。 -
-it/--iterationtime
表示一次迭代应该多长时间。时间指定为整数,并假定为以秒为单位,或者以单位为单位的整数。 -
-wt/--warmuptime
表示预热时间多长。时间格式与迭代时间相同。 -
-ops/--operations
表示每次迭代将包含多少个操作。这将是固定的工作量,并且迭代时间将被忽略。
测试开始后会在终端不断打印测试的运行过程:
--- --- --- --- --- --- --- --- ---
Benchmark: derby
Run mode: timed run
Test type: multi
Threads: 8
Warmup: 120s
Iterations: 1
Run length: 240s
Warmup (120s) begins: Wed Mar 10 08:58:13 UTC 2021
Warmup (120s) ends: Wed Mar 10 09:00:15 UTC 2021
Warmup (120s) result: 769.30 ops/m
Iteration 1 (240s) begins: Wed Mar 10 09:00:15 UTC 2021
Iteration 1 (240s) ends: Wed Mar 10 09:04:15 UTC 2021
Iteration 1 (240s) result: 788.65 ops/m
Valid run!
Score on derby: 788.65 ops/m
最后的 Valid run!
表示测试通过,Score on xxx
后为跑分结果,数字越大表示性能越好。
测试运行完成后会在SPECjvm2008/results
目录下生成SPECjvm2008.<num>
(为自增序列)的目录,即为测试结果。
目录下包含以下内容:
images
SPECjvm2008.<num>.raw
SPECjvm2008.<num>.html
SPECjvm2008.<num>.txt
SPECjvm2008.<num>.sub
SPECjvm2008.<num>.summary
如果某些终端软件不支持X11或因为缺少图形相关软件包而导致在SPECjvm2008.<num>
目录下只生成有效的SPECjvm2008.<num>.raw
文件,可以在其他主机或者其他终端中手动生成html等图形化测试结果,只需要在运行java -jar SPECjvm2008.jar
时后加--reporter <file name>
,其中file name
要指定为SPECjvm2008.<num>.raw
文件。
进入到SPECjvm2008
并执行:
$ java -jar SPECjvm2008.jar --reporter ./results/SPECjvm2008.<num>/SPECjvm2008.<num>.raw
即可在SPECjvm2008.<num>.raw
同级目录下生成相关图形化测试结果。