我正在编写相当低级别的代码,必须对速度进行高度优化.每个CPU周期都很重要.因为代码是用Java编写的,所以我不能像C中那样写低级别,但是我希望能够从VM中获取所有内容.
我正在处理一个字节数组.我的代码有两个部分,我现在主要感兴趣.第一个是:
int key = (data[i] & 0xff)
| ((data[i + 1] & 0xff) << 8)
| ((data[i + 2] & 0xff) << 16)
| ((data[i + 3] & 0xff) << 24);
Run Code Online (Sandbox Code Playgroud)
第二个是:
key = (key << 15) | (key >>> 17);
Run Code Online (Sandbox Code Playgroud)
从性能来看,我猜这些陈述没有按照我的预期进行优化.第二个陈述基本上是一个ROTL 15, key.第一个语句将4个字节加载到int中.0xff如果访问的字节恰好为负,则掩码仅用于补偿由隐式转换为int所产生的添加符号位.这应该很容易转换为高效的机器代码,但令我惊讶的是,如果我删除了掩码,性能会上升.(这当然会破坏我的代码,但我很想知道会发生什么.)
这里发生了什么?最常见的Java VM是否会在JIT期间以期望优秀的C++编译器优化等效C++代码的方式优化此代码?我可以影响这个过程吗?设置-XX:+AggressiveOpts似乎没有区别.
(CPU:x64,平台:Linux/HotSpot)
我想知道如何检查JIT编译器是否已关闭.我有以下代码,这意味着关闭JIT编译器.问题是,我不确定它是否真的这样做.所以我想知道是否有办法检查JIT是否关闭.我查看了Compiler类,但没有任何方法isDisabled/enabled().
码:
Compiler.disable();
Run Code Online (Sandbox Code Playgroud)
任何帮助或方向将受到高度赞赏.