Java可以使用无符号比较进行一般范围内测试吗?

maa*_*nus 5 java performance unsigned

我已经见过该JITC使用用于检查数组边界(所述测试符号比较0 <= x < LIMIT相当于0 ? LIMIT其中?把数字视为无符号数量).所以我很好奇它是否适用于任意形式的比较0 <= x < LIMIT.

结果我的基准是相当混乱.我已经创建了三个表单实验

for (int i=0; i<LENGTH; ++i) {
    int x = data[i];
    if (condition) result += x;
}
Run Code Online (Sandbox Code Playgroud)

条件不同

  • 0 <= xabove
  • x < LIMITbelow
  • 0 <= x && x < LIMITinRange
  • 0 <= x & x < LIMITinRange2

并准备数据,使条件成立的概率相同.

结果应该非常相似,above因为它与零相比可能略快一些.即使JITC无法使用无符号比较进行测试,结果abovebelow应该相似.

谁能解释一下这里发生了什么?我做错了很可能......

更新

我在Ubuntu 2.6.32-54-generic上使用Java build 1.7.0_51-b13和i5-2400 CPU @ 3.10GHz,如果有人关心的话.由于结果inRange及其inRange2附近0.00特别令人困惑,我在该领域采取更多步骤重新运行基准测试.

Dar*_*gue 0

基准测试结果可能存在的差异与不同级别的 CPU 缓存有关。

由于使用了原始 int(s),因此不会发生 JVM 特定的缓存,就像自动装箱 Integer 到原始值时会发生的情况一样。

因此,考虑到 data[] 数组的最小内存消耗,剩下的就是低级别值/操作的 CPU 缓存。由于如上所述,值的分布基于随机值,并且在测试中条件成立的统计“概率”为真,因此可能的原因是,根据值,每个测试都会进行或多或少的(随机)缓存,导致更多的随机性。

此外,根据计算机的隔离(后台服务/进程),测试用例可能不会完全隔离地运行。确保这些测试中除核心操作系统功能和 JVM 之外的所有内容均已关闭。将 JVM 内存最小/最大设置为相同,关闭所有网络进程、更新等。