繁体   English   中英

基准Java方法调用

[英]Benchmark Java Method Calls

我尝试对Java方法调用进行基准测试。 这些调用的问题在于它们正在被内联和优化。

因此,最后我尝试寻找一种避免这些优化的方法。 目前,我使用:

for(int index = 0; index < 100_000_000; index++)
    value = value * 2 % 8;

此计算将替换为JNI和Java的方法。 基准的输出是:

Druation静态jni = 1002ms,实例jni = 1000ms,静态java = 136ms,实例java = 140ms,原始= 145ms

Druation静态jni = 975ms,实例jni = 974ms,静态java = 132ms,实例java = 128ms,原始= 134ms

Druation静态jni = 966毫秒,实例jni = 1084毫秒,静态java = 127毫秒,实例java = 130毫秒,原始= 135毫秒

Druation静态jni = 958ms,实例jni = 1083ms,静态java = 127ms,实例java = 131ms,原始= 134ms

Druation静态jni = 957ms,实例jni = 1085ms,静态java = 126ms,实例java = 131ms,原始= 135ms

从Java与原始(无方法)相比,可以看到内联的影响。 我想知道是否可以做些防止内联的事情?

免责声明

现代JVM太复杂了,并且会进行各种优化。 如果尝试测量一些小的代码,那么在没有非常非常详细的JVM工作知识的情况下正确地进行操作确实很复杂。 为了解决HotSpot / OpenJDK常见的陷阱,使用JMH非常重要。 了解如何编写正确的微基准测试也很重要

答案A

为了避免内联,JMH使用了编译器命令-XX:CompileCommand=command,method[,option]

例如:

-XX:CompileCommand=dontinline,java.lang.String::indexOf

注意 :编译命令可能会忽略编译命令。 请检查编译器日志和生成的代码:

-XX:+UnlockDiagnosticVMOptions
-XX:+PrintCompilation
-XX:+LogCompilation
-XX:LogFile=./compiler.log
-XX:+PrintInlining

答案B

最可靠的方法是完全禁用内联-XX:-Inline

答案C

最好的方法是以这种方式使用JMH。

答案D

最长的方法是等到JEP 165:编译器控制完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM