【发布时间】:2015-01-04 20:00:15
【问题描述】:
我注意到我的一个数字运算程序中的一些看似无辜的 if 语句显着减慢了执行速度(JRE 1.8.25,64 位 Hotspot build 25.25-b02,Intel 64 位 CPU)。
我检查了 JIT 编译器生成的代码,它看起来有点奇怪。下面是一个简单的函数来说明问题:
private float test(float a,float b) {
float c=a+b;
if(c<0) {
return -1;
}
return 0;
}
这是生成代码中有趣的部分:
...
0x2bd17ae: vaddss xmm0,xmm0,xmm1
0x2bd17b2: vxorps xmm1,xmm1,xmm1
0x2bd17b6: vucomiss xmm0,xmm1
0x2bd17ba: mov esi,1h
0x2bd17bf: jp 2bd17d8h
0x2bd17c5: jnbe 2bd17d8h
0x2bd17cb: mov esi,0h
0x2bd17d0: je 2bd17d8h
0x2bd17d6: dec esi ;*fcmpg
0x2bd17d8: cmp esi,0h
0x2bd17db: mov rsi,57448760h ; {metadata(method data for {method} ...}
0x2bd17e5: mov rdi,108h
0x2bd17ef: jnl 2bd17ffh
0x2bd17f5: mov rdi,118h
0x2bd17ff: mov rbx,qword ptr [rsi+rdi]
0x2bd1803: lea rbx,[rbx+1h]
0x2bd1807: mov qword ptr [rsi+rdi],rbx
0x2bd180b: jnl 2bd1c1fh ;*ifge
...
// straightforward code for "return -1f" and "return 0f" follows
...
从 0x2bd17ba 到 0x2bd1807 的代码对我来说没有多大意义。为什么会在那里?知道它的作用吗?
编辑:考虑一下,它可能是 JIT 编译器添加的一些代码来收集运行时统计信息(只是因为“元数据”注释而猜测)。但问题是:为什么会存在?我已经调用了这个方法几百万次,所以我认为代码应该已经达到了最终的优化形式。
【问题讨论】:
标签: java assembly jit disassembly jvm-hotspot