java - Java JIT 编译器(如何)优化我的代码?

标签 java jit compiler-optimization

我正在编写相当低级的代码,必须针对速度进行高度优化。每个 CPU 周期都很重要。由于代码是用 Java 编写的,因此我不能像用 C 那样编写低级别的代码,但我想尽可能地从 VM 中获取所有内容。

我正在处理一个字节数组。目前我主要对代码的两个部分感兴趣。第一个是:

int key =  (data[i]     & 0xff)
        | ((data[i + 1] & 0xff) <<  8)
        | ((data[i + 2] & 0xff) << 16)
        | ((data[i + 3] & 0xff) << 24);

第二个是:

key = (key << 15) | (key >>> 17);

从性能来看,我猜测这些语句没有按照我预期的方式进行优化。第二条语句基本上是 ROTL 15, key。第一个语句将 4 个字节加载到一个 int 中。 0xff 掩码仅用于补偿如果访问的字节恰好为负,则隐式转换为 int 所导致的添加符号位。这应该很容易转化为高效的机器代码,但令我惊讶的是,如果我移除掩码,性能会提高。 (这当然会破坏我的代码,但我很想看看会发生什么。)

这是怎么回事?最常见的 Java VM 是否以人们期望好的 C++ 编译器优化等效 C++ 代码的方式在 JIT 期间优化此代码?我可以影响这个过程吗?设置 -XX:+AggressiveOpts 似乎没有任何区别。

(CPU:x64,平台:Linux/HotSpot)

最佳答案

关于java - Java JIT 编译器(如何)优化我的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8256202/

相关文章:

java - 打包 android.os。不存在 Libgdx Netbeans

java - 为什么我的 Java 程序对于某些值陷入无限 while 循环?

java - 无法在 eclipse 4 中使用@Inject

c# - 检索 JIT 输出

c - 长度为 8 的结构和 uint64_t 的效率

java - 在 TestNG 中跳过测试的最佳做法是什么?

.net - 为什么.net 4.5 中的多核 JIT 不是 "on by default"?

c# - 为什么在通过反射更改静态只读字段后,该只读字段的输出是旧的?

c++ - 将 "-march=native"intel 编译器标志添加到编译行会导致 KNL 上出现浮点异常

c++ - 为什么像 GCC 这样的编译器不能对 vector 做无用代码消除?