我正在编写相当低级的代码,必须针对速度进行高度优化。每个 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)
最佳答案
如何测试性能?
这是一篇好文章:
http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html
http://www.ibm.com/developerworks/java/library/j-benchmark2/index.html
关于java - Java JIT 编译器(如何)优化我的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8256202/