[英]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非常重要。 了解如何编写正确的微基准测试也很重要
为了避免内联,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
最可靠的方法是完全禁用内联-XX:-Inline
最好的方法是以这种方式使用JMH。
最长的方法是等到JEP 165:编译器控制完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.